【C++ Primer 第七章】 构造函数再探

构造函数初始值列表

构造函数的初始值有时必不可少

• 有时我们可以忽略数据成员初始化和赋值之间的差异,但并非总能这样。如果成员时const或者是引用的话,必须将其初始化。类似的,当成员属于某种类类型且该类没有定义默认构造函数时,也必须将这个成员初始化。

例如:

1 class ConstRef
2 {
3 public:
4     ConstRef(int ii);
5 private:
6     int i;
7     const int ci;
8     int &ri;
9 };

和其他常量对象或者引用一样,成员ci和ri都必须被初始化。因此,如果我们没有为它们提供构造函数初始值的话将引发错误:

1 //错误:ci和ri必须初始化
2 
3 ConstRef::ConstRef(int ii)
4 {
5 //赋值
6     i=ii;  //正确
7     ci=ii;   //错误:不能给const赋值
8     ri=i;    //错误:ri没有初始化
9 }

随着构造函数体一开始执行,初始化就完成了。我们初始化const或者引用类型的数据成员的唯一机会就是通过构造函数初始值,因此该构造函数的正确形式应该是:

ConstRef::ConstRef(int ii): i(ii),ci(ii),ri(i) {}  //正确:显式地初始化引用和const成员

如果成员时const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值(因为如果进行赋值操作,首先要进行一次默认初始化,这样要使用都类类型的默认构造函数)。

成员初始化顺序

猜你喜欢

转载自www.cnblogs.com/sunbines/p/8905833.html