构造函数可以分为两个阶段执行:(1)初始化阶段;(2)普通的计算阶段(即可以是那些赋值语句之类的。)
不管成员是否在构造函数初始化列表中显示初始化,类类型的成员总是在初始化阶段初始化。
比如这样一个class:
class A {
public: A(int ii);
private: int i; const int ci; int &ri;
};
在执行构造函数A(int ii)时都要先初始化,再能执行构造函数体内的赋值。
那么ci和ri如果不在初始化列表里初始化,是不能执行完初始化操作的。也就是说,初始化const或者引用类型数据成员的唯一机会就是在构造函数初始化列表中。
所以上述构造函数可以写为 A::A(int ii) : ci(ii), ri(ii) {i = ii;}
补充一点:内置类型的成员不进行隐式初始化,所以上述成员i不需要在初始化阶段初始化,当然也可以初始化,只是不管是在初始化列表中初始化还是在函数体内赋值,其效率是一样的。即
A::A(int ii) : ci(ii), ri(ii) {i = ii;} 与A::A(int ii) : i(ii), ci(ii), ri(ii) {} 效率相同。都正确。
首先,你得分清什么是初始化,什么是赋值!