第十三章 拷贝控制
1. 拷贝构造函数第一个参数必须是自身类类型的引用。否则不会成功。
2.注意直接初始化和拷贝初始化的区别。
3.赋值运算符,以=为例:Foo& operator=(const Foo&);通常返回一个指向其左侧运算对象的引用。
4.拷贝构造和拷贝赋值区别:前者产生新对象,后者是在已有对象上赋值。
5.析构函数释放对象使用的资源,并销毁对象的非static数据成员。无返回值和参数。不可被重载。
6.需要析构函数的类也需要拷贝和赋值操作。合成析构函数不会delete一个指针数据成员。用合成构造和赋值操作可能会delete一个指针两次。
7.拷贝构造和赋值操作几乎是在一起的,但不一定需要析构函数。
8.使用=default,显式要求编译器生成合成版本构造函数或者赋值,析构函数。
9.使用=delete来组织拷贝,不能删除析构函数。
10.本质上,当不可能拷贝、赋值或销毁类的成员时,类的合成拷贝控制成员就被定义为删除的。
11.赋值运算符组合了析构函数和构造函数的操作,先拷贝右侧对象,释放左侧对象资源,再赋值。防范自赋值的重要性。
12.智能指针引用计数的原理,自己实现。核心时把计数器保存再动态内存中,当拷贝或赋值对象时,我们拷贝指向计数器的指针。
13.swap函数应该调用swap,而不是std::swap,std::swap并不会隐藏特定版本的swap声明。
14.在赋值运算符中使用swap时异常安全的,能正确处理自赋值。
15.vector在重新分配空间时,避免拷贝原有数据,而是使用移动构造函数。效率更高。
16.右值引用:不能将左值引用绑定到右值,但是可以将右值引用和const左值引用绑定到右值。
17.左值持久,右值短暂。右值绑定即将销毁的对象。
18.可以使用move来将右值引用绑定到左值。move调用使用std::move而不是move。
19.移动构造函数,noexcept关键字。
20.左值和右值,拷贝构造函数都是可以的,但是移动构造函数只能时右值。且右值对移动构造函数更为精准匹配。
21.三/五原则:5个拷贝控制成员时一个整体,定义了一个,就应该定义所有。
22.区分拷贝和移动构造函数的方法:前者接受const T&,后者接受T&&。
23.引用限定符:&和&&,指出this可以指向一个左值或右值。
24.右值进行sort时可以原址排序很安全。对象时右值,意味着没有其他用户。左值则不然,需要先拷贝。