构造函数是 C++ 中实现类的初始化、对象复制、赋值、移动、内存管理等操作的重要工具。本页整理了各类编译器自动生成的 C++ 构造函数(或运算符)的名称、形式、生成的条件及其功能。
为了方便叙述,对本表内容作出如下约定:
1. 本文在表示构造函数(或运算符)时,统一使用 Foo 作为构造函数(或运算符)所属类的类名。
2. “功能” 列所指成员均为非静态成员。
3. 默认初始化:根据初始化位置,在全局作用域初始化时初始为0、空字符串等初始值;在局部作用为内存中的随机值。
名称 | 形式 | 条件 | 功能 |
缺省构造函数 (Default Constructor) | Foo(); | 不存在任何自建的构造函数 | 1. 对类成员调用构造函数; 2. 对其它成员默认初始化 (Default Initialization)。 |
析构函数 (Destructor) | ~Foo(); | 不存在自建的析构函数 | 1. 对类成员调用析构函数; 2. 对其它成员自动释放资源。(指针本身将被释放,指针所指向的内存资源不会被释放) |
拷贝构造函数 (Copy Constructor) | Foo(const Foo &); | 1. 不存在自建的拷贝构造函数; 2. 所有成员对象的拷贝构造函数均可用; 3. 所有成员对象的析构函数均可用。 | 1. 对类成员调用拷贝构造函数; 2. 对其它成员逐一拷贝。(数组中的元素则被逐一拷贝) 3. 在无移动构造函数时代替移动构造函数被调用 |
拷贝赋值函数 (Copy-Assignment Operator) | Foo& operator=(const Foo &); | 1. 不存在自建的拷贝赋值函数; 2. 所有成员对象的拷贝赋值函数均可用; 3. 所有成员对象的析构函数均可用。 4. 不存在 const 或引用类型的成员 | 1. 对类成员调用拷贝赋值函数; 2. 对其它成员逐一赋值。(数组中的元素被则逐一赋值) 3. 在无移动赋值函数时代替移动构造函数被调用 |
移动构造函数 (Move Constructor) | Foo(Foo &&); | 1. 不存在自建的拷贝构造函数或拷贝赋值函数或析构函数 2. 不存在自建的移动构造函数 3. 所有成员均可移动 4. 所有成员的析构函数均可用 | 1. 对类成员调用移动构造函数; 2. 对其它成员逐一移动。(数组中的元素被则逐一移动) |
移动赋值函数 (Move-Assignment Operator) | Foo& operator=(Foo &&); | 1. 不存在自建的拷贝构造函数或拷贝赋值函数或析构函数 2. 不存在自建的移动赋值函数 3. 所有成员均可移动 4. 所有成员的析构函数均可用 5. 不存在 const 或引用类型的成员 | 1. 对类成员调用移动赋值函数; 2. 对其它成员逐一移动赋值。(数组中的元素被则逐一移动赋值) |