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 | 隐式生命周期类可以具有用户提供的析构函数 | 禁止 |