mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-24 08:10:19 +08:00
item17:update
This commit is contained in:
parent
7f0d63ced2
commit
9bc01b1f4d
20
3.MovingToModernCpp/item17.md
Normal file
20
3.MovingToModernCpp/item17.md
Normal file
@ -0,0 +1,20 @@
|
||||
## Item 17:理解特殊成员函数函数的生成
|
||||
条款 17:理解特殊成员函数函数的生成
|
||||
|
||||
在C++术语中,特殊成员函数是指C++自己生成的函数。C++98有四个:默认构造函数函数,析构函数,拷贝构造函数,拷贝赋值运算符。这些函数仅在需要的时候才生成,比如某个代码使用它们但是它们没有在类中声明。默认构造函数仅在类完全没有构造函数的时候才生成。(防止编译器为某个类生成构造函数,但是你希望那个构造函数有参数)生成的特殊成员函数是隐式public且inline,除非该类是继承自某个具有虚函数的类,否则生成的析构函数是非虚的。
|
||||
|
||||
但是你早就知道这些了。好吧好吧,都说古老的历史:美索不达米亚,商朝,FORTRAN,C++98。但是时代改变了,C++生成特殊成员的规则也改变了。要留意这些新规则,因为用C++高效编程方面很少有像它们一样重要的东西需要知道。
|
||||
|
||||
C++11特殊成员函数俱乐部迎来了两位新会员:移动构造函数和移动赋值运算符。它们的签名是:
|
||||
```cpp
|
||||
class Widget {
|
||||
public:
|
||||
...
|
||||
Widget(Widget&& rhs);
|
||||
Widget& operator=(Widget&& rhs);
|
||||
...
|
||||
};
|
||||
```
|
||||
掌控它们生成和行为的规则类似于拷贝系列。移动操作仅在需要的时候生成,如果生成了,就会对非static数据执行逐成员的移动。那意味着移动构造函数根据rhs参数里面对应的成员移动构造出新部分,移动赋值运算符根据参数里面对应的非static成员移动赋值。移动构造函数也移动构造基类部分(如果有的话),移动赋值运算符也是移动赋值基类部分。
|
||||
|
||||
现在,当我对一个数据成员或者基类使用移动构造或者移动赋值,没有任何保证移动一定会真的发生。逐成员移动,实际上,更想逐成员的移动请求,因对为不可移动的类型使用移动操作实际上执行的是拷贝。
|
@ -29,7 +29,7 @@
|
||||
8. [Item 14:如果函数不抛出异常请使用noexcept](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item14.md)
|
||||
9. [Item 15:尽可能的使用constexpr](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item15.md)
|
||||
10. [Item 16:让const成员函数线程安全](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item16.md) __由 @windski贡献__
|
||||
11. Item 17:理解特殊成员函数函数的生成
|
||||
11. [Item 17:理解特殊成员函数函数的生成](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item17.md) __更新中__
|
||||
4. 智能指针
|
||||
1. Item 18:对于占有性资源使用std::unique_ptr
|
||||
2. Item 19:对于共享性资源使用std::shared_ptr
|
||||
|
20575
x.public/EffectiveModernCpp.pdf
Normal file
20575
x.public/EffectiveModernCpp.pdf
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user