简述C++11就地初始化与列表初始化
1.就地初始化
1.1简介
在C++11之前,只能对结构体或类的静态常量成员进行就地初始化,其他的不行。
classC { private: staticconstinta=10; //yes inta=10; //no }
在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码:
classC { private: inta=7; //C++11only intb{7};//或intb={7};C++11only intc(7); //error };
注意,小括号初始化方式不能应用于就地初始化。
1.2就地初始化与初始化列表的先后顺序
C++11标准支持了就地初始化非静态数据成员的同时,初始化列表的方式也被保留下来,也就是说既可以使用就地初始化,也可以使用初始化列表来完成数据成员的初始化工作。当二者同时使用时,并不冲突,初始化列表发生在就地初始化之后,即最终的初始化结果以初始化列表为准。参考如下代码:
#includeusingnamespacestd; classMem { public: Mem(inti,intj):m1(i),m2(j){} intm1=1; intm2={2}; }; intmain() { Memmem(11,22); cout<<"m1="< 程序输出结果:
m1=11m2=22
2.列表初始化
C++11之前主要有以下几种初始化方式:
//小括号初始化 stringstr("hello"); //等号初始化 stringstr="hello"; //POD对象与POD数组列表初始化 structStudnet { char*name; intage; }; Studnets={"dablelv",18};//纯数据(PlainofData,POD)类型对象 StudnetsArr[]={{"dablelv",18},{"tommy",19}};//POD数组 //构造函数的初始化列表 classClass { intx; public: Class():x(0){} };这么多的对象初始化方式,不仅增加了学习成本,也使得代码风格有较大出入,影响了代码的可读性和统一性。从C++11开始,对列表初始化(ListInitialization)的功能进行了扩充,可以作用于任何类型对象的初始化,至此,列表初始化方式完成了天下大一统。
classTest { inta; intb; public: C(inti,intj); }; Testt{0,0};//C++11only,相当于Testt(0,0); Test*pT=newTest{1,2};//C++11only,相当于Test*pT=newTest{1,2}; int*a=newint[3]{1,2,0}; //C++11only此外,C++11列表初始化还可以应用于容器,终于可以摆脱push_back()调用了,C++11中可以直观地初始化容器:
//C++11containerinitializer vectorvs={"first","second","third"}; map singers={{"LadyGaga","+1(212)555-7890"},{"BeyonceKnowles","+1(212)555-0987"}}; 因此,可以将C++11提供的列表初始化作为统一的初始化方式,既降低了记忆难度,也提高的代码的统一度。
以上就是简述C++11就地初始化与列表初始化的详细内容,更多关于C++11就地初始化与列表初始化的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。