拷贝控制
拷贝控制操作
类通过定义5种特殊的成员函数来控制这些操作。其中包括:
- 拷贝构造函数
- 移动构造函数
- 拷贝赋值运算符
- 移动赋值运算符
- 析构函数
1和2定义了用同类型的另一个对象初始化本对象时做了什么
3和4定义了一个对象赋予同类型的另一个对象时做了什么
5定义了此类型对象销毁时做了什么
拷贝构造函数
注意:
- 第一个参数必须是引用类型
- 几乎总是一个const引用
- 不应该是explicit的
如何拷贝
- 类类型:使用其拷贝构造函数拷贝
- 内置类型:直接拷贝
- 数组:逐元素拷贝
- 数组元素是类:使用元素的拷贝构造函数来拷贝
拷贝初始化和直接初始化区别
直接初始化要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。拷贝初始化要求编译器将右侧运算对象拷贝到正在创建的对象中,如果需要还要进行类型转换。
拷贝初始化通常使用拷贝构造函数来完成,直接初始化也可能调用拷贝构造函数
拷贝初始化发生时机
- 用=定义变量时
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中元素或一个聚合类中的成员
为什么参数必须是引用的
为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又需要调用拷贝构造函数。造成无限循环
拷贝赋值运算符
重载运算符
- 赋值运算符必须定义为成员函数
- 左侧运算对象绑定到this参数,右侧运算对象作为显示参数传递
- 赋值运算符返回一个指向左侧运算对象的引用(为了a=b=c的执行)
有合成拷贝赋值运算符的版本
析构函数
作用:释放对象使用的资源,销毁对象的非static数据成员
没有返回值,没有参数,不能重载,唯一
完成工作
类类型:执行成员自己的析构函数
内置类型:什么也不需要
注意:隐式销毁一个内置指针类型的成员不会delete它所指对象
何时调用
无论何时一个对象被销毁,就会自动调用其析构函数。
成员实在析构函数体之后隐含的析构阶段被销毁的,析构函数体作为成员销毁步骤之外的另一部分而进行的