C++的构造函数有:
- 默认构造函数
- 析构函数
- 拷贝构造函数
- 拷贝赋值函数
- 移动构造函数
- 移动赋值函数
生成这些特殊成员函数(或不生成)的规则比较复杂,每个特殊成员函数有几种不同的状态:
- 隐式声明还是用户声明
- 默认提供还是用户提供
- 正常状态还是删除状态
隐式声明的必然是默认提供的;默认提供的才可能被删除;用户提供的也必然是用户声明的。
C++默认构造函数是否提供的情况:
-
如果自定义了一个任意的构造函数,系统将不在提供默认无参构造
-
如果自定了一个构造函数,系统还会提供一个拷贝构造
-
如果自定义了一个拷贝构造.系统将不在提供默认拷贝构造
-
如果自定义一个析构函数,系统将不在提供默认的析构函数
-
没有初始化的非静态 const 数据成员和引用类型数据成员:导致默认提供的默认构造函数被删除。
-
非静态的 const 数据成员和引用类型数据成员:导致默认提供的拷贝构造函数、拷贝赋值函数、移动构造函数和移动赋值函数被删除。
-
用户如果没有自己提供一个拷贝构造函数(必须形如 Obj(Obj&) 或 Obj(const Obj&);不是模板:导致编译器会隐式声明一个。
-
用户如果没有自己提供一个拷贝赋值函数(必须形如 Obj& operator=(Obj&) 或 Obj& operator=(const Obj&);不是模板):编译器会隐式声明一个。
-
用户如果自己声明了一个移动构造函数或移动赋值函数:则默认提供的拷贝构造函数和拷贝赋值函数被删除。
-
用户如果没有自己声明拷贝构造函数、拷贝赋值函数、移动赋值函数和析构函数:编译器会隐式声明一个移动构造函数。
-
用户如果没有自己声明拷贝构造函数、拷贝赋值函数、移动构造函数和析构函数:编译器会隐式声明一个移动赋值函数。