7.5.5聚合类

  • 聚合类的特征
  1. 所有成员都是 public 的。
  2. 没有定义任何构造函数。
  3. 没有类内初始值。
  4. 没有基类,没有 virtual 函数。
struct Data
{
  int ival;
  string s;
};

可以用花括号括起来的成员初始值列表来初始化聚合类的数据成员。

	val1.ival = {0 , "Anna"}; //正确
	val2.ival = {"Anna" , 0 }; //错误:初始值顺序要与声明顺序一致

如果初始值列表的元素数量小于类成员数量,则剩余成员被值初始化。初始值列表元素个数不能超过类成员数量。

  • 显示初始化类成员缺点
  1. 类的成员都是 public 的。
  2. 添加或删除一个成员之后,所有的初始化语句都要更新。
  3. 将正确初始化对象的成员的任务交给了用户而非作者,容易出错。

7.5.6字面值常量类

字面值类型的类可能含有 constexpr 函数成员。

  • 数据成员都是字面值类型的聚合类是字面值常量类。
  • 其他字面值常量类的特征
  1. 数据成员必须都是字面值常量。
  2. 类必须至少含有一个 constexpr 构造函数。
  3. 如果一个数据成员有类内初始值,则内置类型成员的初始值必须使用成员自己的 constexpr 构造函数。
  4. 类必须使用构析函数的默认定义,该成员负责销毁类的对象。

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 的参数过返回类型。