C++移动构造函数

一、背景

拷贝构造函数又分为浅拷贝和深拷贝,但是存在如下问题:

    浅拷贝:当类中有指针时,直接复制,会使多个指针指向同一块内存,导致重复析构
    深拷贝:每次都是重新赋值一份,这种方法内存消耗较大

因此C++就提供了移动构造函数,

  1. 当需要动态分配内存或其他资源,并且资源的所有权需要在不同对象之间传递时,移动构造函数可以更高效地完成任务。

  2. 当使用临时对象进行操作时,移动构造函数可以避免不必要的复制和析构操作,提高程序的效率和性能。

二、定义

移动构造函数是参数类型为右值引用的拷贝构造函数

语法:

类名 ( 类名 && ) (1) (C++11 起)
class_name ( 类名 && ) = default; (2) (C++11 起)
class_name ( 类名 && ) = delete;

 默认情况下,左值初始化同类对象只能通过拷贝构造函数完成,如果想调用移动构造函数,则必须使用右值进行初始化。C++11 标准中为了满足用户使用左值初始化同类对象时,也通过移动构造函数完成的需求,新引入了 std::move() 函数,它可以将左值强制转换成对应的右值,由此便可以使用移动构造函数。

三、使用

#include
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++移动构造函数_第1张图片

移动构造函数_C++中文网

C++11 移动构造函数_关于移动构造函数_庭树的博客-CSDN博客

你可能感兴趣的:(C++,c++,开发语言)