1、构造函数初始化列表:
class t {
public:
t(int ii);
private:
int i;
const int ci;
int &ri;
};
t::t(int ii) {
i = ii;
ci = ii; //error:cannot assign to a const
ri = i; //error: to ri which was not bound to an object
}
t::t(int ii): i(ii), ci(ii), ri(ii) {
}
从概念上讲,可以认为构造函数分两个阶段执行:1、初始化阶段。2、普通的计算阶段(函数体中)
不管成员是否在构造函数初始化列表中显示初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段开始之前。
上面的例子const int ci在初始化阶段已经初始化,不能在函数体中被赋值了。而引用&ri没有绑定到一个对象。
因此,上例中的构造函数只能通过构造函数初始化列表来实现。
2、如果类定义了带有参数的构造函数,则系统不会产生一个默认构造函数了。如果没有显示地定义一个默认构造函数,则不能定义该类的数组了。即node n[10]:这样编译器会报错