0 结论
- 特种成员函数:C++中会自动生成的成员函数;
- 移动操作仅当类中未包含用户显示声明的复制操作、移动操作和析构操作时才生成;
- 成员函数模版在任何情况下都不会一直特种成员的生成;
- 复制函数尽在类中不包含用户显示声明的复制构造函数时才生成,如果该类中声明了移动操作则复制构造函数将被删除;
- 复制赋值运算符函仅当类中不包含显示声明的复制赋值运算符才生成,如果该类声明了移动操作符,则复制赋值运算符将被删除;
- 在已经存在的现实声明的析构函数的条件下,生成复制操作将成为被废弃的行为。
1 特种成员函数特点
- 仅在需要时才会生成;
- 都具有public访问层级且是inline的;
- 都是非虚的,
2 移动操作
在C++11中新增添了两个成员函数(移动构造哈沭河和移动赋值运算符【在支持移动操作的成员上执行移动操作,在不支持移动操作的成员上执行复制操作】)。
class A{
A(A&& rhs);
A& operator=(A&& rhs);
};
如果你声明了复制构造函数或运算符函数中的一个,编译器在你使用中会自动生成另一个;但是如果你声明了移动构函数或移动操作中的一个,编译器则不会自动生成另一个。
如果显示声明了复制操作,编译器也不会生成移动操作;同样的一旦声明移动操作,编译器就会废除复制操作。
大三律原则,复制构造函数、复制赋值运算符、析构函数,如果声明了其中一个,就同时声明了所有这三个。【推论:如果用户声明了析构函数,那么默认的复制操作应该也不适用于该类(C++为了不破坏太多的保留代码,保持了前面的结论)】这就意味着只要声明析构函数,就相当于声明了复制操作,也就不会生成移动操作。
当存在三大律还想使用默认的移动操作时,使用关键词=default 放在函数之参数列表之后。
3 特种成员函数机制
- 默认构造函数:仅当类中不包含用户声明的构造函数时才生效。
- 析构函数:析构函数默认是
noexcept ,仅当基类的虚函数为虚,派生类的析构函数才是虚的。 - 复制构造函数:
- 按成员进行非静态数据成员的复制构造。
- 仅当类中不包含用户声明的复制构造函数时才生成。
- 如果该类声明了移动操作,则复制构造函数将被删除。
- 在已存在复制赋值运算符或析构函数的条件下,仍然生成复制构造函数已被废弃。
- 复制赋值运算符:
- 按成员进行非静态数据成员的复制赋值。
- 仅当类中不包含用户声明的复制赋值运算符时才生成。
- 如果该类声明了移动操作,则肤质构造函数将被删除。
- 在已存在复制构造函数或析构函数的条件下,仍然生成复制赋值运算符已被废弃。
- 移动构造函数和移动赋值运算符:都按成员进行非静态数据成员的移动操作。仅当类中不包含用户声明的复制操作,移动操作和析构函数时才生效。
|