移动构造函数(c++11)

1.概念

1)C++中对象发生拷贝的场景可以分为两种,一种是被拷贝的对象还要继续使用,另一种是被拷贝的对象不再使用;第二种一般可以认为是对右值的拷贝

2)C++11中引入了移动构造函数,对象发生拷贝时不需要重新分配空间而是使用被拷贝对象的内存,从而提高代码运行效率

3)移动构造函数的第一个参数必须是自身类型的右值引用(不需要const,为啥?右值使用const没有意义),若存在额外的参数,任何额外的参数都必须有默认实参

4)移动构造函数构造对象时不再分配新内存,而是接管源对象的内存,移动后源对象进入可被销毁的状态,所以源对象中如果有指针数据成员,那么它们应该在移动构造函数中应该赋值为NULL

5)因为移动操作不分配内存,所以不会抛出任何异常,因此用noexcept指定(如果定义在类的外面,那么定义也要用noexcept指定)

2.合成移动构造函数

1)只有当一个类没有自定义任何拷贝控制成员,且每个非static数据成员都可以移动(数据成员的移动操作未被delete),编译器才会定义合成移动构造函数

2)例外:基类使用“=default”声明了虚析构函数时,且没有自定义其他拷贝控制成员,此时即使这个析构函数指明是编译器合成版本的,编译器也不会合成移动操作(统计显示,编译器合成的移动操作通常会跟虚折构函数有冲突——知乎轮子哥)

3.拷贝构造函数和移动构造函数的匹配

1)既有拷贝构造又有移动构造的话,根据实参来选择使用哪一个

2)如果一个类有拷贝构造函数没有移动构造函数,这时候编译器不会合成移动构造函数,所以无论是左值引用还是右值引用的实参,均使用拷贝构造函数,此时会将右值引用转化为左值引用

3)上述过程用拷贝构造函数代替移动构造函数肯定是安全的:因为拷贝构造函数既满足获得源对象值的要求,并且源对象还处于有效的状态

原文地址:https://www.cnblogs.com/Joezzz/p/9707250.html