来自cppreference.com
< cpp‎ | language

类是用户定义类型。

类类型可由类指定符定义,它出现于声明语法的 decl-specifier-seq 中。类指定符拥有下列格式:

class-key attr class-head-name { member-specification } (1)
class-key attr class-head-name : base-specifier-list { member-specification } (2)
class-key - classstructunion 之一
attr(C++11) - 可选的任意数量的属性序列
class-head-name - 被定义的类名。可选地前接 nested-name-specifier (名称和作用域解析运算符的序列,以作用域解析运算符结尾),可选地后随关键词 final 。可以忽略该名称,此情况下类是无名的(注意无名类不可为 final )
base-specifier-list - 一或多个亲类及对每个使用的继承模式的列表(见派生类
member-specification - 访问指定符、成员对象及成员函数声明及定义的列表(见类定义

类关键 structclass 在 C++ 中不可分,除了默认访问模式和默认继承模式 若类定义使用 struct 类关键则为 public ,若类定义使用 class 类关键则为 privateclassstruct 均可用于类定义

类关键 union 的定义导致联合体定义,它定义在同一时刻只保有其一个数据成员的类。

类可拥有下列类型的成员

a) 非静态数据成员,包括位域
b) 静态数据成员
2) 成员函数
b) 静态成员函数
3) 嵌套类型
a) 定义于类定义中的嵌套类枚举
b) 既存类型的别名,以 typedef类型别名声明定义
c) 在类自身定义中的类名称表现为其自身的 public 成员类型别名,为了查找之便(除非在用作构造函数名时):这被称作注入类名
4) 定义于类中的所有无作用域枚举的枚举项
5) 成员模板变量模板、 (C++14 起)类模板或函数模板)可出现于任何非局部 class/struct/union 定义体内。

成员在类定义中一次性定义,不能添加成员到已定义的类(不同于命名空间的成员)

T 的成员不能使用 T 作为其名,若它是静态数据成员、成员函数、成员类型、成员模板、无作用域枚举的枚举项、匿名成员联合体的成员。然而,非静态数据成员可使用名称 T ,只要无用户声明的构造函数。

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

声明或继承了至少一个纯虚函数的类是抽象类。不能创建此类型的对象。

拥有 constexpr 构造函数的类是字面类型 (LiteralType) :此类型的对象能用 constexpr 函数在编译时操作。

一些成员函数是特殊的:某些条件下编译器定义它们,即使用户不定义。它们是: