- 析构函数:释放掉在对象使用期间获得的资源,包括关于任意的new操作调用对应的delete,关闭任何打开的文件,等等。
- 拷贝构造函数和移动构造函数:构造一个新的对象,被初始化为与另一个同样类型对象相同的状态。如果这个已存在的对象是一个左值,那么就用拷贝构造函数;而如果这个已存在的对象是一个右值,那么就用移动构造函数。在以下实例中将调用拷贝构造函数或移动构造函数(1)带初始化的声明(2)使用传值调用(3)传值返回的对象。
- 拷贝赋值和移动赋值(operator=):当=用于两个先前均被构造过的对象时,则调用赋值运算符。lhs=rhs,如果rhs是一个左值,那么可通过使用拷贝赋值运算符完成;如果rhs是一个右值,那么可通过使用移动赋值运算符做到。默认时,拷贝赋值运算符是通过依次把拷贝赋值运算符用于每一个数据成员而被实现。
- 通常情况下,如果一个类由基本类型的数据成员组成,对其进行默认处理通常是有意义的。当时当指针作为数据成员时,假设该指针指向一个动态定址的对象,默认的析构函数对那些指针类型的数据成员无能为力。不仅如此,拷贝构造函数和拷贝赋值运算符均赋值指针的值而不是指针所指向的对象。这样,我们将有两个实例,他们都包含指针,而指针又都指向相同的对象,这就是所谓的浅拷贝,但是典型情况我们应该得到深拷贝,从而得到整个对象的复制品。因此,当一个类包含指针作为数据成员时,一般我们必须自己实现析构函数,拷贝赋值和拷贝构造函数。这么做排除了移动的默认情形,因此还必须自己实现移动赋值和移动构造函数。
- 编写五大函数的任意一个,那么显示的考虑所有其他的几个会是个好习惯。如以IntCell类为例
~IntCell(){cout<<“Invoking destructor”<<endl;}//析构
IntCell(const IntCell & lhs)=default;//拷贝构造
IntCell(IntCell &&rhs)=default;//移动构造
IntCell & operator=(const IntCell & lhs)=default;//拷贝赋值
IntCell & operator=(IntCell && rhs)=default;