C++类构造函数初始化列表

C++类构造函数初始化列表

ID:38262083

大小:21.19 KB

页数:5页

时间:2019-06-07

C++类构造函数初始化列表_第1页
C++类构造函数初始化列表_第2页
C++类构造函数初始化列表_第3页
C++类构造函数初始化列表_第4页
C++类构造函数初始化列表_第5页
资源描述:

《C++类构造函数初始化列表》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C++类构造函数初始化列表初始化列表的定义在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:一种是构造函数内对类的成员赋值,一种则是使用初始化列表的构造函数显式的初始化类的成员。构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:classCExample{public:inta;floatb;//构造函数初始化列表CExample():a(0),b(8.8){}//构造函数内部赋值CExample(){a=0;b=8.8;}};从技术上说,用初始化列

2、表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑初始化列表的必要性初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但在一些情况下,初始化列表可以做到构造函数做不到的事情:1、类里面有const类型的成员,它是不能被赋值的,所以需要在初始化列表里面初始化它;2、引用类型的成员(也就是名字成员,它作为一个现有名字的别名),也是需要在初始化列表里面初始化的,目的是为了生成了一个其名字成员在

3、类外可以被修改而在内部是只读的对象;3、需要调用基类的构造函数,且此基类构造函数是有参数的;4、类里面有其他类类型的成员,且这个“其他类”的构造函数是有参数的。举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。classCExampleOld{public:CExampleOld(intx){...}};因为CExampleOld有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建CExampleOld的一个实例。CExampleOld*pEO=newCExa

4、mpleOld;//出错!!CExampleOld*pEO=newCExampleOld(2);//OK如果CExampleOld是另一个类的成员,你怎样初始化它呢?答案是你必须使用成员初始化列表。classCExampleNew{CExampleOldm_EO;public:CExampleNew();};//必须使用初始化列表来初始化成员m_EO//CExampleNew::CExampleNew():m_EO(2){……}没有其它办法将参数传递给m_EO。情况3和4其实一样的道理。如果成员是一个常量对象或者引用也是一样。根据C++的

5、规则,常量对象和引用不能被赋值,它们只能被初始化。初始化列表与构造函数赋值的效率比较首先把数据成员按类型分类并分情况说明:1.内置数据类型,复合类型(指针,引用)在成员初始化列表和构造函数体内进行,两者在性能和结果上都是一样的2.用户定义类型(类类型)两者在结果上相同,但是性能上存在很大的差别。因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以对于用户自定义类型(类),在初始化列表中只会调用类的构造函数,在构造函数体中赋值就会先调用一次类的构造函数,然后再调用一次类的赋值操作符函数。显然后者在性能上有所损失,特别对于构造函数和

6、赋值操作符都需要分配内存空间的情况,使用初始化列表,就可以避免不必要的多次内存分配。举个例子:假定你有一个类CExample具有一个CString类型的成员m_str,你想把它初始化为"Hi,howareyou."。你有两种选择:1、使用构造函数赋值CExample::CExample(){//使用赋值操作符//CString::operator=(LPCTSTR);m_str=_T("Hi,howareyou.");}2、使用初始化列表CExample::CExample():m_str(_T("Hi,howareyou.")){}编译

7、器总是确保所有成员对象在构造函数体执行之前被初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString::CString(LPCTSTR)的调用并将"Hi,howareyou."传递给这个函数。结果是在第一个例子中调用了两个CString函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。在CString的例子里这是无所谓的,因为缺省构造函数是内联的,CString只是在需要时为字符串分配内存(即,当你实际赋值时)。但是

8、,一般而言,重复的函数调用是浪费资源的,尤其是当构造函数和赋值操作符分配内存的时候。在一些大的类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负责分配大量内存空间的Init函数。在

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

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

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