一、背景
拷贝构造函数又分为浅拷贝和深拷贝:
浅拷贝:当类中有指针时,直接复制,会使多个指针指向同一块内存,导致重复析构
深拷贝:每次都是重新赋值一份,这种方法内存消耗较大
因此C++就提供了移动构造函数,
将原来对象的东西移动到新的对象上, 移动后原对象不再指向被移动的资源,这些资源的所有权已经归属新创建的对象。
二、定义
移动构造函数是参数类型为右值引用的拷贝构造函数
语法:
类名 ( 类名 && ) | (1) | (C++11 起) | |||||||
class_name ( 类名 && ) = default; | (2) | (C++11 起) | |||||||
class_name ( 类名 && ) = delete; |
默认情况下,左值初始化同类对象只能通过拷贝构造函数完成,如果想调用移动构造函数,则必须使用右值进行初始化。C++11 标准中为了满足用户使用左值初始化同类对象时,也通过移动构造函数完成的需求,新引入了 std::move() 函数,它可以将左值强制转换成对应的右值,由此便可以使用移动构造函数。
三、使用
#include<iostream>
using namespace std;
class A{
public:
A(){
this->num = new int(10);
cout << "构造函数" << endl;
}
A(A&x){
this->num = new int(*x.num);
cout << "拷贝构造函数" << endl;
}
A(A&&x){
this->num = x.num;
x.num = nullptr;
cout << "移动构造函数" << endl;
}
~A(){
cout << "析构函数" << endl;
}
private:
int *num;
};
void test(){
A a;
A b=a;
A c(move(a));
}
int main()
{
test();
system("pause");
return 0;
}
移动构造函数_C++中文网
C++11 移动构造函数_关于移动构造函数_庭树的博客-CSDN博客