Namespaces
Variants

Classes

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

类是一种用户定义类型。

类类型由类说明符定义,它出现在 声明 语法的 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_cast typeid 进行查询。虚成员函数参与动态绑定。

至少拥有一个已声明或继承的纯虚成员函数的类称为 抽象类 。无法创建该类型的对象。

具有 constexpr 构造函数的类属于 LiteralType :该类型的对象可以通过 constexpr 函数在编译期进行操作。

(since 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++标准。

缺陷报告 适用标准 发布时行为 正确行为
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 隐式生命周期类可以具有用户提供的析构函数 禁止