类
来自 cppreference.cn
类是用户定义类型。
类类型由类说明符定义,其出现在声明语法的 decl-specifier-seq 中。参阅类声明以了解类说明符的语法。
类可以有以下种类的成员
1) 数据成员
b) 静态数据成员
2) 成员函数
a) 非静态成员函数
b) 静态成员函数
3) 嵌套类型
所有成员都在类定义中一次性定义,不能添加到已定义的类中(与命名空间成员不同)。
如果类 T
的成员是以下之一,则不能使用 T
作为其名称:
- 静态数据成员,
- 成员函数,
- 成员类型,
- 成员模板,
- 枚举的枚举器(除非枚举有作用域)(C++11 起),或
- 成员匿名联合的成员。
然而,只要没有用户声明的构造函数,非静态数据成员可以使用名称 T
。
一个至少有一个声明或继承的虚成员函数的类是多态的。此类型的对象是多态对象,并在对象表示中存储运行时类型信息,可以使用 dynamic_cast
和 typeid
查询。虚成员函数参与动态绑定。
一个至少有一个声明或继承的纯虚成员函数的类是抽象类。此类型的对象不能被创建。
(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 类中可以用户声明复制赋值运算符或析构函数,如果它们未定义。 若未定义,则在 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 | 隐式生命周期类可以拥有用户提供的析构函数 | 已禁止 |