有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数函数体中对他们赋值不起作用。没有默认构造函数的类类型成员,以及const 或引用类型的成员。不管是那种类型,都必须在构造函数初始化列表中进行初始化。
可以初始化const对象或引用类型的对象。但不能对他们进行赋值。在开始执行构造函数的函数体之前,要完成初始化。初始化const或引用类型数据成员的唯一机会是构造函数初始化列表中。
下面的构造函数式错误的:
class ConstRef
{
public:
ConstRef(int ii);
private:
int i;
const int ci;
int &ri;
};
ConstRef::ConstRef(int ii)
{
i = ii; //ok
ci = ii; //error: cannot assign to a const
ri = i; //assisgn to ri which was not bound to an object
}
正确的方式:
ConstRef::ConstRef(int ii) : i(ii), ci(i) , ri(ii){ }
建议使用构造函数初始化列表:
在许多类中,初始化和赋值严格来讲都是低效率的: 数据成员可能已经被直接初始化了,还要对它进行初始化和赋值。比效率问题,更重要的是某些数据成员必须被初始化。这是一个事实。
必须对任何const 或 引用类型的成员以及没有默认构造函数的类类型成员使用初始化形式。。