命名空间
变体
操作

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句(循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++17 中弃用*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

类是用户定义的类型。

类类型由类说明符定义,该说明符出现在 decl-specifier-seq声明 语法中。有关类说明符的语法,请参见 类声明

一个类可以具有以下类型的成员

1) 数据成员
2) 成员函数
3) 嵌套类型
a) 嵌套类 和在类定义中定义的 枚举
b) 现有类型的别名,使用 typedef 类型别名 (自 C++11 起)声明定义
c) 类自身定义中的名称充当其自身的公共成员类型别名,用于 查找(除非用于命名 构造函数):这被称为注入类名
4) 来自类中定义的所有无作用域枚举的 枚举器,或由 using 声明using-enum 声明 引入(自 C++20 起)
5) 成员模板变量模板、(自 C++14 起)类模板或函数模板)可以出现在任何非局部类/结构体/联合体的正文中。

所有成员都在类定义中一次性定义,它们不能添加到已定义的类中(与命名空间的成员不同)

如果类 T 的成员是以下类型,则不能使用 T 作为其名称

  • 静态数据成员,
  • 成员函数,
  • 成员类型,
  • 成员模板,
  • 枚举的枚举器 (除非枚举是作用域枚举)(自 C++11 起),或
  • 成员匿名联合体的成员。

但是,只要没有用户声明的构造函数,非静态数据成员可以使用名称 T

具有至少一个声明或继承的 成员函数的类是多态的。这种类型的对象是 多态对象,并且具有作为对象表示一部分存储的运行时类型信息,可以使用 dynamic_casttypeid 查询。虚成员函数参与动态绑定。

具有至少一个声明或继承的纯虚成员函数的类是抽象类。无法创建此类型的对象。

具有 constexpr 构造函数的类是 字面类型:此类型的对象可以在编译时由 constexpr 函数操作。

(自 C++11 起)

目录

[编辑] 类的属性

可平凡复制类

可平凡复制类是一个类,它

平凡类

平凡类是一个类,它

(在 C++26 中已弃用)

标准布局类

标准布局类是一个类,它

  • 没有类型为非标准布局类(或此类类型的数组)或引用的 非静态数据成员
  • 没有 虚函数 并且没有 虚基类
  • 对所有非静态数据成员具有相同的 访问控制
  • 没有非标准布局基类,
  • 层次结构中只有一个类具有非静态数据成员,并且
  • 非正式地,没有基类的类型与第一个非静态数据成员的类型相同。或者,正式地:给定类 S,没有类型集合 M(S) 的元素作为基类,其中类型 X 的 M(X) 定义为
  • 如果 X 是没有(可能继承的)非静态数据成员的非联合类类型,则集合 M(X) 为空。
  • 如果 X 是非联合类类型,其第一个非静态数据成员的类型为 X0(其中所述成员可能是匿名联合体),则集合 M(X) 由 X0 和 M(X0) 的元素组成。
  • 如果 X 是联合体类型,则集合 M(X) 是所有 M(Ui) 的并集和包含所有 Ui 的集合,其中每个 Ui 是 X 的第 i 个非静态数据成员的类型。
  • 如果 X 是元素类型为 Xe 的数组类型,则集合 M(X) 由 Xe 和 M(Xe) 的元素组成。
  • 如果 X 是非类、非数组类型,则集合 M(X) 为空。

标准布局结构体是用类关键字 struct 或类关键字 class 定义的标准布局类。标准布局联合体是用类关键字 union 定义的标准布局类。

(自 C++11 起)

[编辑] 隐式生命周期类

隐式生命周期类是一个类,它

  • 是一个 聚合体,其析构函数不是用户声明的(直到 C++11)用户提供的(自 C++11 起),或者
  • 至少有一个平凡的合格构造函数和一个平凡的、非删除的析构函数。

注意:隐式生命周期属性由缺陷报告 P0593R6 澄清。

[编辑] POD 类

POD 类是一个类,它

  • 是一个 聚合体
  • 没有用户声明的复制赋值运算符,
  • 没有用户声明的析构函数,并且
  • 没有类型为非 POD 类(或此类类型的数组)或引用的非静态数据成员。
(直到 C++11)
  • 是平凡类,
  • 是标准布局类,并且
  • 没有类型为非 POD 类(或此类类型的数组)的非静态数据成员。
(自 C++11 起)

POD 结构体是非联合 POD 类。POD 联合体是 POD 类的联合体。

(在 C++20 中已弃用)

[编辑] 缺陷报告

以下行为变更的缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
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 隐式生命周期类可能具有用户提供的析构函数 禁止