命名空间
变体
操作

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

类是用户定义类型。

类类型由类说明符定义,其出现在声明语法的 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++ 标准。

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