移动语义: 以移动而非深拷贝的方式初始化含有指针成员的类对象。移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。
在旧版的拷贝构造函数的实现中,当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝的方式复制该指针成员。
(否则一旦多个对象中的指针成员指向同一块堆空间,这些对象析构时就会对该空间释放多次,这是不允许的)
如果临时对象中的指针成员申请了大量的堆空间,那么深拷贝操作势必会影响对象初始化的执行效率。
移动构造函数
移动构造函数一定要将原先的数据置零否则会出现程序崩溃等问题
move()将左值转换成右值。
#include<iostream>
using namespace std;
class Data {
public:
Data(const int d) : data(new int(0)){
size=d;
}
// 移动构造函数
Data(Data&& other) : data(new int(0)){
cout << "Data Move Constructor!" << endl;
size = other.size;
data = other.data;
other.size = 0;
other.data = nullptr;
}
private:
int* data;
int size;
};
int main() {
// 创建一个Data对象
Data data(10);
Data &d =
// 移动构造函数
Data data_move = move(data);
return 0;
}
当类中同时包含拷贝构造函数和移动构造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数时,编译器才会退而求其次,调用拷贝构造函数。
实际开发中,通常在类中自定义移动构造函数的同时,会再为其自定义一个适当的拷贝构造函数。当用户利用右值初始化类对象时,会调用移动构造函数;使用左值(非右值)初始化类对象时,会调用拷贝构造函数