7.5.5聚合类
- 聚合类的特征
- 所有成员都是 public 的。
- 没有定义任何构造函数。
- 没有类内初始值。
- 没有基类,没有 virtual 函数。
struct Data
{
int ival;
string s;
};
可以用花括号括起来的成员初始值列表来初始化聚合类的数据成员。
val1.ival = {0 , "Anna"}; //正确
val2.ival = {"Anna" , 0 }; //错误:初始值顺序要与声明顺序一致
如果初始值列表的元素数量小于类成员数量,则剩余成员被值初始化。初始值列表元素个数不能超过类成员数量。
- 显示初始化类成员缺点
- 类的成员都是 public 的。
- 添加或删除一个成员之后,所有的初始化语句都要更新。
- 将正确初始化对象的成员的任务交给了用户而非作者,容易出错。
7.5.6字面值常量类
字面值类型的类可能含有 constexpr 函数成员。
- 数据成员都是字面值类型的聚合类是字面值常量类。
- 其他字面值常量类的特征
- 数据成员必须都是字面值常量。
- 类必须至少含有一个 constexpr 构造函数。
- 如果一个数据成员有类内初始值,则内置类型成员的初始值必须使用成员自己的 constexpr 构造函数。
- 类必须使用构析函数的默认定义,该成员负责销毁类的对象。
constexpr 构造函数
constexpr 构造函数可以声明为 = default 的形式或者删除函数的形式。否则 constexpr 构造函数就必须既符合构造函数的要求,又符合 constexpr 函数的要求。
class Debug
{
public:
constexpr Debug(bool b = true): hw(b), io(b), other(b) {}
constexpr Debug(bool h, bool i, bool o): hw(h), io(i), other(o) {}
constexpr bool any() { return hw || io || other; }
private:
bool hw;
bool io;
bool other;
};
constexpr 构造函数必须初始化全部数据成员,初始值要么是常量表达式,要么使用 constexpr 构造函数。
- constexpr 构造函数用于生成 constexpr 对象以及 constexpr 的参数过返回类型。