类中的const常量必须要在拷贝构造函数中定义符号常量使用关键字const吗

为了账号安全,请及时绑定邮箱和手机
成员函数里有const类型时,拷贝构造函数该怎么定义???
private: string m_strN
int m_iA const int m_iM};Teatcher::Teatcher (const Teatcher &) { cout && "Teatcher (const Teatcher &tea)" &&}报错如下: 2 IntelliSense:
"Teatcher::Teatcher(const Teatcher &)" 未提供初始值设定项:
常量 成员 "Teatcher::m_iMax" d:\VCcodes\learn_c++\learn_c++\Teacher.cpp 14 1 learn_c++
对啦!请问里面的数是几都没关系么
是的,任意整数都行
写下你的评论...
写下你的评论...
写下你的评论...
Copyright (C) 2018 imooc.com All Rights Reserved | 京ICP备 号-11你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
书上这么说
网上甚至说直接在声明时初始化会编译不通过
但是在VS2013中,这么写却通过了。
class&Test
&&&&Test(){
&&&&&&&&cout&&&&&constructing...\n&;&
&&&&&&&&cout&&&&m_V
&&&&~Test(){&cout&&&&&destructing...\n&;&}
&&&&const&int&m_Value&=&10;
上面的写法在 Dev C++中给出了一个警告(VS2013中任何警告都没有)
[Warning]&non-static&data&member&initializers&only&available&with&-std=c++11&or&-std=gnu++11&[enabled&by&default]
PS: 将VS2013中平台工具集改成了VS2010,就报错了
error&C2864:&“Test::m_Value”:&只有静态常量整型数据成员才可以在类中初始化
error&C2758:&“Test::m_Value”:&必须在构造函数基/成员初始值设定项列表中初始化
大概是 C++ 11 中对这个限制做了更改吧
要回复问题请先或
浏览: 1404
关注: 5 人类成员变量中存在引用,const,和指针类型时需要注意的事项
编译器默认生成函数的规则如下:
1.定义一个类时,如果自己没有声明,那么编译器会自动帮助生成一个拷贝构造函数(copy construction),赋值操作符(copy assignment),析构函数(deconstruction)。
2.如果没有声明任何构造函数(包括拷贝构造函数),编译器会帮助声明一个默认构造函数。
构造函数(包括编译器生成的默认构造函数)的执行包括两个阶段:
1.初始化阶段
2.构造函数体内代码执行构造的阶段
构造函数执行的两个阶段非常重要,在初始化阶段,如果类中存在类类型的成员变量,那么会调用这个类类型的成员变量的默认构造函数来初始化这个成员变量,如果是内置类型,那么可能会对内置类型的变量初始化,也可能不会对其初始化(这点和内置类型的变量是全局变量还是局部变量有关系)。
弄明白了初始化阶段的工作后就明白了构造函数体内执行的代码都是赋值操作而不是初始化操作了。因为初始化操作在构造函数体的代码执行之前就已经完成了。我们也可以对初始化阶段的工作进行控制,这就是C++中的构造函数初始化列表。C++中构造函数初始化列表就是控制初始化阶段的,如果没有提供初始化列表,那么会调用成员变量中的默认构造函数来初始化成员变量。
1.构造函数执行的两个阶段
以一个例子来感受下构造函数执行的两个阶段,自定义两个类,让其中一个类作为另外一个类的成员变量:
class Bitmap
//默认的构造函数
std::cout&&&bitmap construction:&&<this<
输出结果如下:&
B//这条语句会调用默认的构造函数
Widget w1(bb);//因为Widget带有Bitmap参数的构造函数中使用了初始化列表,所以在初始化阶段调用了拷贝构造函数来创建成员变量b,它的地址是ox28ff2e。2.如果自定义了构造函数,那么一定也要加上默认构造函数
其实上面的例子已经可以说明问题了,就是Widget类中的Bitmap成员变量在初始化阶段自动调用了默认的构造函数,如果一个类中不存在默认的构造函数(即自己定义了构造函数但是忘记添加默认的构造函数),那么这个类是其他类的成员变量时必须在构造函数初始化列表中提供参数进行初始化,否则会由于在初始化阶段需要调用默认构造函数而却没有而导致构造失败。还是写上一个例子,在上面的类中在加上一个Pane类,注意Widget类的构造函数也做了一些改变:&#include
class Bitmap
//默认的构造函数
std::cout&&&bitmap construction:&&<this< obj1(s,1);
NamedObject obj2(obj1);
obj2=obj1;
5.类中存在指针类型的对象
当类中存在指针类型的变量时,需要注意编译器不会自动为其调用类的构造函数,这时需要手动设置指针为NULL或调用new为其动态创建对象。
同时也需要注意编译器自动创建的赋值操作符和拷贝构造函数是否符合自己的要求了。因为编译编译器自动创建的赋值操作符和拷贝构造函数只是简单的进行赋值操作。
下面是一个易懂但是不具备异常安全和自我赋值安全的赋值操作符定义:
class Bitmap
std::cout&&&bitmap construction:&&
</this<</this<温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
概念上说,final 表示不可变,只能赋值一次,初次赋值之后就不能再赋其它值了,是只读变量。而 const 表示常量,更准确地说是编译时常量,因此 const 也是只读的、不可变的。const 和 final 都可以表示不可变,但又有细微的差异。变量声明var 或者类型可以声明变量,而 const 和 final 也可以用于声明变量。声明 var 的地方可以用 const 或 final 代替。声明类型的地方可以与 const 或 final 组合使用。例如下面这些声明都是可以的:var a = 1;const a = 1;final a = 1;int a = 1;const int a = 1;final int a = 1;这里 const 和 final 没有区别,因为变量 a 被立即赋值为一个数字常量。区别一:final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。区别二:final 是惰性初始化,即在运行时第一次使用前才初始化。而 const 是在编译时就确定值了。编译时常量指的是:字面量(如数字、bool、字符串、List的字面量形式)、其它常量 或者 常量的算术运算,也可以是这些的组合形式(递归要求),简单地说常量就是可以在编译时确定的值。const a = 8;const b =const c =const d = 5 * 3;const e = a * d + 2;而其它形式,比如一个函数调用的返回值、实例化一个新的对象就不是编译时常量了,它们在运行时才能获得结果。final x = new DateTime.now();//okconst x = new DateTime.now();//errorfinal y = sin(90);//okconst y = sin(90);//errorfinal 实例成员类中的 final 成员要么在声明时直接初始化,要么在初始化列表中初始化:class X {
X(this.a){
}}或class X {
X(a): this.a = a{
}}或class X {
final a = 0;
}}const 实例成员只能直接声明。class X {
const a = 0;
}}常量对象和常量构造函数前面说的编译时常量还包括常量对象,也就是通过 const 构造函数创建的对象。如果一个类的所有实例成员都是 final 或 const 实例成员,那么该类所创建的对象的状态就是不可变的。这种情况下就可以定义 const 构造函数,const 构造函数所创建的对象就是常量对象。在语法上,const 构造函数要在构造函数前面加上 const 修饰符,同时用 const 代替 new 来调用构造函数。也可以用 new 调用 const 构造函数,但那样就不能用 const 声明该变量了。此外,const 构造函数也不能有函数体。class X {
// all instance variables are final or const
const a = 1;
const X(this.b); // no body
static const m = const X(3);//ok, a static const member}main(){
const x = const X(3);// ok
const x = new X(3);// error
final x = const X(3);// ok
final x = new X(3);// ok}常量对象还有一个特点,相同的常量对象始终只有一个。identical(const X(3), const X(3)) // =&truegetConst() =& const [1, 2]; main() {
var a = getConst();
var b = getConst();
identical(a, b); // =&true } 区别三:const 可以修饰变量,也可以修饰值(value)。而 final 只用来修饰变量。const list = [1, 2, 3]; // errorconst list = const [1, 2, 3]; // okconst list = const [new DateTime.now(), 2, 3]; // error, because new DateTime.now() is not constconst list = const [const X(3), 2, 3]; // okvar x = 5;const list = const[x]; //errorconst x = 5;const list = const[x];//ok//final、var或类型定义的变量都不要求右边必需是 const,但右边的 const 修饰符要求值必需是常量final list = [1, 2, 3]; // okfinal list = const [1, 2, 3]; // okfinal list = const [new DateTime.now(), 2, 3]; // error, because new DateTime.now() is not constconst 修饰值的时候,要求值必需是常量或由常量组成。var、final等在左边定义变量时,并不关心右边是不是常量。但如果右边用了 const,那么不管左边是什么要求,右边都必需是常量。
阅读(1969)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Dart 中的 const 与 final',
blogAbstract:'起初,我也对 const 和 final 的区别感到迷惑,并且在日常的快速开发中这两个修饰符用的不多。因此我查了一些解释,在这里做个整理记录。概念上说,final 表示不可变,只能赋值一次,初次赋值之后就不能再赋其它值了,是只读变量。而 const 表示常量,更准确地说是编译时常量,因此 const 也是只读的、不可变的。const 和 final 都可以表示不可变,但又有细微的差异。变量声明var 或者类型可以声明变量,而 const 和 final 也可以用于声明变量。声明 var 的地方可以用 const 或 final 代替。声明类型的地方可以与 const 或 final 组合使用。例如下面这些声明都是可以的:',
blogTag:'dart',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:8,
permalink:'blog/static/',
commentCount:2,
mainCommentCount:2,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}为了账号安全,请及时绑定邮箱和手机
类中的const常量必须要在拷贝构造函数中定义吗
class Teacher{public: Teacher(string name = "JIM", unsigned int age = 20, unsigned int max = 20); Teacher(const Teacher &tea);private: string m_strN string m_strG unsigned int m_iA const unsigned int m_iM};Teacher::Teacher(string name, unsigned int age, unsigned int max): m_strName(name),m_iAge(age), m_iMax(max){ cout && "Teacher(string name, unsigned int age)" &&}Teacher::Teacher(const Teacher &tea){ cout && "Teacher::Teacher(const Teacher &tea)" && }Teacher t1;Teacher t2 = t1; //编译error
写下你的评论...
写下你的评论...
写下你的评论...
Copyright (C) 2018 imooc.com All Rights Reserved | 京ICP备 号-11

我要回帖

更多关于 定义符号常量使用关键字const 的文章

 

随机推荐