构造函数初始化列表
一、什么是构造函数初始化列表
构造函数初始化列表,是在构造函数的基础上,后面以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
class A { public: int a; int b; //一般的构造函数 A(int x, int y) { a = x; b = y; } };
class A { public: int a; int b; //构造函数初始化列表 A(int x, int y):a(x),b(y) {/*空函数体*/} };
一般的构造函数和构造函数初始化列表有什么区别?
1、这两个构造函数实现的效果是一样的,都可以实现类内成员变量的初始化
2、构造函数初始化列表的使用面更广,有些类型数据(const、引用)的初始化操作使用一般的构造函数初始化不了。
注意:static静态局部变量的初始化不能在参数列表中进行,只能在构造函数内进行
下面会重点举这方面的例子
1、类内没有默认构造函数的成员类对象;(构造函数不带参数,即如果类里面的类对象需要初始化,一般的构造函数初始化不了)
正确的做法是使用构造函数参数列表,列表里面对类对象进行初始化赋值
2、类内const成员或引用类型的成员。(const全局静态变量只能在初始化的时候赋值,其它时候赋值不了)
错误的方法
正确使用方法
还有重要的一点是,使用构造函数初始化列表比一般的构造函数效率高,初始化列表会把初始化和赋值放在一起进行,只需要拷贝构造一次,而一般的构造函数需要拷贝构造两次
使用构造函数初始化列表
使用一般构造函数
二、构造函数初始化列表 的顺序问题
最后在总结一下
1、一般的构造函数不能初始化自带构造函数的类对象
2、一般的构造函数不能初始化const变量和引用变量
3、static变量不能使用列表参数去初始化
4、使用列表参数初始化类内成员变量的效率会更高
5、使用列表参数的时候,声明类内变量的前后顺序很重要,在进行初始化的时候,要避免用一个未初始化的参数去初始化另一个参数
等风起的那一天,我已准备好一切