(45)聚合类、字面值常量类

来源:互联网 发布:cgi网络内部请求错误 编辑:程序博客网 时间:2024/05/18 16:37

聚合类

聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的:
一.所有成员是public的
二.没有定义任何构造函数
三.没有类内初始值
四.没有基类,也没有virtual函数
如:
struct Data{   int ival;   string s;}


我们可以提供一个花括号括起来的成员初始值列表,并用它初始化聚合类的数据成员:

Data vall={0,"Anna"};
初始值的顺序必须与生命的顺序一致。

显式地初始化类的对象的成员存在三个明显的缺点:
一.要求类的所有成员都是public的
二.将正确初始化每个对象的每个成员的重任交给了类的用户(而非类的作者)。因为用户很容易忘掉某个初始值,或者提供一个不
  恰当的初始值,所以这样的初始化过程冗长乏味且容易出错
三.添加或删除一个成员之后,所有的初始化语句都需要更新

字面值常量类

数据成员都是字面值类型的聚合类是字面值常量类。如果一个类不是聚合类,但它符合下述要求,则它也是一个字面值常量类:
一.数据成员必须是字面值类型
二.类必须至少含有一个constexpr构造函数
三.如果一个数据成员含有一个类内初始值,则内置类型成员的初始值必须是一条常量表达式,或者如果成员属于某种类类型,则初
  始值必须使用成员自己的constexpr构造函数
四.类必须使用析构函数的默认定义,该成员负责销毁类的对象

constexpr构造函数
尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。实际上,一个字面值常量类必须至少提供一个
constxpr构造函数。

constexpr构造函数必须初始化所有数据成员,初始值或者使用constexpr构造函数,或者是一条常量表达式。
0 0