成员初始化列表和构造函数体中的区别.docx

成员初始化列表和构造函数体中的区别.docx

ID:57576492

大小:20.17 KB

页数:5页

时间:2020-08-27

成员初始化列表和构造函数体中的区别.docx_第1页
成员初始化列表和构造函数体中的区别.docx_第2页
成员初始化列表和构造函数体中的区别.docx_第3页
成员初始化列表和构造函数体中的区别.docx_第4页
成员初始化列表和构造函数体中的区别.docx_第5页
资源描述:

《成员初始化列表和构造函数体中的区别.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、成员初始化列表和构造函数体中的区别论坛中回答一个别人问题C++Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值。请问这里的初始化数据成员与对数据成员赋值的含义是什么?有什么区别?我知道在数据成员有默认构造函数时是有不同的,但对其他类型的成员呢?其他类型成员的初始化和赋值有区别吗?===========================================

2、=============================================是这个意思:首先把数据成员按类型分类1。内置数据类型,复合类型(指针,引用)2。用户定义类型(类类型)分情况说明:对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的对于类型2,结果上相同,但是性能上存在很大的差别因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为

3、)举个例说明classA;classB{public:B(){a=3;}private:Aa;}classA{public:A(){}A(int){value=3;}intvalue;}像上面,我们使a对象的value为3,调用一个A的构造函数+一个默认拷贝赋值符,才达到目的B::B():a(3){}像这样,只调用了一个构造函数就达到了所需的对象啦,所以性能好的转载他人一篇我的问题是关于初始化C++类成员的。我见过许多这样的代码(包括在你的栏目中也见到过):CSomeClass::CSomeClass(){x=0;y=1;}而在别的什么地方则写成下面的样子:CSomeCla

4、ss::CSomeClass():x(0),y(1){}我的一些程序员朋友说第二种方法比较好,但他们都不知道为什么是这样。你能告诉我这两种类成员初始化方法的区别吗?回答从技术上说,你的程序员朋友是对的,但是在大多数情况下,两者实际上没有区别。有两个原因使得我们选择第二种语法,它被称为成员初始化列表:一个原因是必须的,另一个只是出于效率考虑。让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。classCMember{public:CMember(intx){...}};因为Cmember有一个显式声明的构造函数,

5、编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建Cmember的一个实例。CMember*pm=newCMember;//Error!!CMember*pm=newCMember(2);//OK如果Cmember是另一个类的成员,你怎样初始化它呢?你必须使用成员初始化列表。classCMyClass{CMemberm_member;public:CMyClass();};//必须使用成员初始化列表CMyClass::CMyClass():m_member(2){•••}没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据

6、C++的规则,常量对象和引用不能被赋值,它们只能被初始化。第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。MFC的Cstring提供了一个完美的例子。假定你有一个类CmyClass具有一个Cstring类型的成员m_str,你想把它初始化为"yadayada."。你有两种选择:CMyClass::CMyClass(){//使用赋值操作符//CString::operator=(LPCTSTR);m_str=_T("yadayada");}//使用类成员列表//andconstructorCString::CString(LPCTSTR)CMyCl

7、ass::CMyClass():m_str(_T("yadayada")){}在它们之间有什么不同吗?是的。编译器总是确保所有成员对象在构造函数体执行之前初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString::CString(LPCTSTR)的调用并将"yadayada"传递给这个函数。结果是在第一个例子中调用了两个Cstring函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。在Cstr

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。