EffectiveModernCppChinese/3.MovingToModernCpp/item17.md
2019-06-24 19:12:29 +08:00

1.9 KiB
Raw Blame History

Item 17:理解特殊成员函数函数的生成

条款 17:理解特殊成员函数函数的生成

在C++术语中特殊成员函数是指C++自己生成的函数。C++98有四个默认构造函数函数析构函数拷贝构造函数拷贝赋值运算符。这些函数仅在需要的时候才生成比如某个代码使用它们但是它们没有在类中声明。默认构造函数仅在类完全没有构造函数的时候才生成。防止编译器为某个类生成构造函数但是你希望那个构造函数有参数生成的特殊成员函数是隐式public且inline除非该类是继承自某个具有虚函数的类否则生成的析构函数是非虚的。

但是你早就知道这些了。好吧好吧都说古老的历史美索不达米亚商朝FORTRAN,C++98。但是时代改变了C++生成特殊成员的规则也改变了。要留意这些新规则因为用C++高效编程方面很少有像它们一样重要的东西需要知道。

C++11特殊成员函数俱乐部迎来了两位新会员移动构造函数和移动赋值运算符。它们的签名是

class Widget {
public:
	...
    Widget(Widget&& rhs);
    Widget& operator=(Widget&& rhs);
	... 
};

掌控它们生成和行为的规则类似于拷贝系列。移动操作仅在需要的时候生成如果生成了就会对非static数据执行逐成员的移动。那意味着移动构造函数根据rhs参数里面对应的成员移动构造出新部分移动赋值运算符根据参数里面对应的非static成员移动赋值。移动构造函数也移动构造基类部分如果有的话移动赋值运算符也是移动赋值基类部分。

现在,当我对一个数据成员或者基类使用移动构造或者移动赋值,没有任何保证移动一定会真的发生。逐成员移动,实际上,更想逐成员的移动请求,因对为不可移动的类型使用移动操作实际上执行的是拷贝。