摘要
使用构造函数初始值列表,主要因为两个方面:
- 底层效率更高。对比下面的方法一,由于少了一步赋值操作,初始值列表效率更高。
- 必须使用初始值列表的场合。对于const成员变量或引用,以及当成员属于某种类类型且该类没有定义默认构造函数时,必须使用初始值列表对变量进行初始化。
一句话笔记
通常我们定义一个变量时,习惯立马就将其初始化。对于类成员变量而言,我们也希望变量被定义后有一个初始值,一般有两种做法:
class CMyClass
{
public:
CMyClass();
private:
int i;
const int ci;
int &ri;
}
//方法一:在构造函数内对变量赋值(注意:变量在进入构造函数前就已经被默认初始化过)
CMyClass::CMyClass()
{
this->i = 0;
this->ci = 0; //error! const量不能修改
this->ri = i; //error! ri是引用,没有被初始化为某个变量的别名
}
//方法二:构造函数初始值列表初始化变量
CMyClass::CMyClass() : i(0), ci(0), (i)
{
}
- 对于方法一,变量在进入构造函数前就已经被默认初始化过,在构造函数里只是再次对其赋值而已。
- 对于方法二,变量在进入构造函数前就已经被初始值列表初始化了,构造函数里不需要再赋值。
- 方法一的弊端是,它其实只是赋值操作,并不是初始化;一方面其多了次赋值操作,效率比方法二低;另一方面赋值操作无法对const变量赋值,而变量的引用需要提前初始化好后才能使用。
- 方法二的弊端是,
要注意,无论给定的初始值列表顺序如何,类成员变量的初始化顺序都与其在类中出现的顺序一致
;这表明一个类成员变量如果需要依靠另一个类成员变量初始化的话,这两个变量在类中的定义顺序就很关键了。
为什么需要用构造函数初始值列表
- 底层效率更高。对比方法一,由于少了一步赋值操作,初始值列表效率更高。
- 必须使用初始值列表的场合。对于const成员变量或引用,以及当成员属于某种类类型且该类没有定义默认构造函数时,必须使用初始值列表对变量进行初始化。
相关/参考链接
《C++ prime 第五版》p258