Classes
类是一种用户定义类型。
类类型由类说明符定义,它出现在 声明 语法的 decl-specifier-seq 中。关于类说明符的语法请参阅 类声明 。
一个类可以包含以下类型的成员:
所有成员都在类定义中一次性定义,无法向已定义的类添加成员(与命名空间的成员不同)
类
T
的成员不能使用
T
作为其名称,如果该成员是
- 静态数据成员,
- 成员函数,
- 成员类型,
- 成员模板,
- 枚举的枚举项 (除非该枚举为作用域枚举) (C++11 起) ,或
- 成员匿名联合体的成员。
然而,只要没有用户声明的构造函数,非静态数据成员可以使用名称
T
。
拥有至少一个声明或继承的
虚
成员函数的类被称为
多态类
。该类型的对象是
多态对象
,其对象表示中存储着运行时类型信息,可通过
dynamic_cast
和
typeid
进行查询。虚成员函数参与动态绑定。
至少拥有一个已声明或继承的纯虚成员函数的类称为 抽象类 。无法创建该类型的对象。
|
具有 constexpr 构造函数的类属于 LiteralType :该类型的对象可以通过 constexpr 函数在编译期进行操作。 |
(since C++11) |
目录 |
类的属性
可平凡复制类一个 可平凡复制类 是指满足以下条件的类:
标准布局类一个 标准布局类 是指满足以下条件的类:
标准布局结构体 是指使用类关键词 struct 或 class 定义的标准布局类。 标准布局联合体 是指使用类关键词 union 定义的标准布局类。 |
(C++11 起) |
隐式生命周期类
一个 隐式生命周期类 是指满足以下条件的类:
说明:隐式生命周期特性已通过缺陷报告 P0593R6 得到澄清。
POD类一个 POD类 是指满足以下条件的类:
POD结构体 是指非联合体的POD类。 POD联合体 是指作为POD类的联合体。 |
(C++20 中弃用) |
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| CWG 148 | C++98 |
POD类不能包含指向成员的指针,
而这些指针本身是POD(标量)类型 |
移除该限制 |
| CWG 383 | C++98 |
复制赋值运算符或析构函数可以在POD类中
声明(但未定义) |
不允许 |
| CWG 1363 | C++11 |
同时具有平凡默认构造函数和非平凡
默认构造函数的类可能是平凡的 |
应为非平凡 |
| CWG 1496 | C++11 |
所有构造函数均被定义为
已删除的类可能是平凡的 |
应为非平凡 |
| CWG 1672 | C++11 |
具有多个空基类的类可能
是标准布局类 |
不是标准布局类 |
| CWG 1734 | C++11 |
可平凡复制的类不能具有非平凡
的已删除复制/移动构造函数/赋值运算符 |
若被删除仍可为平凡 |
| CWG 1813 | C++11 |
若类具有继承非静态数据成员的
基类,则永远不是标准布局类 |
可以是标准布局类 |
| CWG 1881 | C++11 |
对于标准布局类及其基类,
未命名的位字段可能在声明 数据成员的不同类中声明 |
所有非静态数据成员
和位字段需首先在 同一类中声明 |
| CWG 1909 | C++98 | 成员模板可以与其类同名 | 禁止 |
| CWG 2120 | C++11 |
确定标准布局类时M(X)的定义
未考虑首个成员是 数组的情况 |
在M(X)定义中
处理这种情况 |
| CWG 2605 | C++98 | 隐式生命周期类可以具有用户提供的析构函数 | 禁止 |