构造函数初始值列表
构造函数的初始值有时必不可少
• 有时我们可以忽略数据成员初始化和赋值之间的差异,但并非总能这样。如果成员时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、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值(因为如果进行赋值操作,首先要进行一次默认初始化,这样要使用都类类型的默认构造函数)。
成员初始化顺序