构造函数再探
赋值与初始化区别
赋值法如下:
class ConstRef{
public:
ConstRef(int ii);
private:
int i;
const int ci;
int & ri;
}
ConstRef::ConstRef(int ii){ //错误写法
i = ii;
ci = ii;
ri = i;
}
初始化法如下:
ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(i){}; //正确写法
Tag:如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们通过构造函数初始值列表为这些成员提供初值。
成员初始化顺序
成员初始化顺序与成员定义顺序一致,而不受构造函数初始化列表影响
应该尽量避免使用某些成员初始化其他成员
默认实参和构造函数
如果一个构造函数为所有参数都提供了默认实参,则它实际上也定义了默认构造函数
委托构造函数
class Sales_data{
//非委托
Sales_data(string s,unsigned cnt,double price):bookNo(s),units_sold(cnt),revenue(cnt*price){}
//委托
Sales_data:Sales_data("",0,0){}
Sales_data(string s):Sales_data(s,0,0){} //该构造函数委托给三参数构造函数
Sales_data(istream &is)Sales_data(){read(is,*this)} //该构造函数委托给默认构造函数
}
委托后的执行顺序为:委托初始值列表->受委托初始值列表->受委托函数体->委托函数体