C++11标准扩展了构造函数初始值的功能,使我们可以定义委托构造函数。一个委托构造函数使用它所属类的其他构造函数执行自己的初始化过程被称为委托构造。
和其他构造函数一样,一个委托构造函数也有一个成员初始值的列表和一个函数体。在委托构造函数内,成员初始值列表只有一个唯一入口,就是类名本身。和其他成员初始值一样,类名后面紧跟圆括号括起来的参数列表,参数列表必须与类中另外一个构造函数匹配。
我们使用委托构造函数重写Sales_data类,重写后的形式:
class Sales_data {
public:
// 非委托构造函数使用对应的实参初始化成员
Sales_data(std::string s, unsigned cnt, double price):
bookNo(s), units_sold(cnt), revenue(cnt*price) { }
// 其余构造函数全都委托给另一个构造函数
Sales_data(): Sales_data("", 0, 0) {}
Sales_data(std::string s): Sales_data(s,0,0) {}
Sales_data(std::istream &is): Sales_data()
{ read(is, *this); }
};
class NoDefault {
public:
NoDefault(const std::string&);
//还有其他成员,但是没有其他构造函数
};
struct A {
NoDefault my_mem;
};
A a; //错误: 不能为A合成构造函数
struct B {
B() {} //错误: b_member没有初始值
NoDefault b_member;
};
本文介绍了C++11引入的委托构造函数特性,通过示例展示了如何使用委托构造函数简化类的初始化过程。在Sales_data类的重写中,各种构造函数都委托给一个主要的构造函数进行初始化,提高了代码的简洁性和一致性。同时,文章通过NoDefault类和A、B结构体的例子说明了没有默认构造函数的情况及其影响。

1139

被折叠的 条评论
为什么被折叠?



