移动语义 和 类禁用拷贝赋值 注意点

1.类禁用拷贝赋值 注意点

  • 看,不能使用拷贝赋值了

  • 但是这样可以,原因:A a3 = a1;调用的是拷贝构造
struct A 
{
	A()
	{
		cout << "构造函数!" << endl;
	}
	A(const A&)
	{
		cout << "拷贝构造!" << endl;
	}
	A(const A&&)
	{
		cout << "移动构造!" << endl;
	}
	~A()
	{
		cout << "析构函数!" << endl;
	}
	A& operator = (const A&) = delete;
};
int main()
{
	A a1;
	A a2(move(a1));
	A a3 = a1;
}
输出:
构造函数!
移动构造!
拷贝构造!
析构函数!
析构函数!
析构函数!

2.移动语义

  • move
struct A 
{
	A()
	{
		cout << "构造函数!" << endl;
	}
	A(const A&)
	{
		cout << "拷贝构造!" << endl;
	}
	A(const A&&)
	{
		cout << "移动构造!" << endl;
	}
	~A()
	{
		cout << "析构函数!" << endl;
	}
	A& operator = (const A&)
	{
		cout << "拷贝赋值!" << endl;
		return *this;
	}
	int a = 1;
};
int main()
{
	{
		A a1;
		A a3(a1);
		{
			A&& a2(move(a1));
			cout << a2.a << endl;
			a3 = a2;
		}
		cout << a1.a << endl;
	}
	cout << "----------------------------分隔符--------------------------------" << endl;
	int&& rRef1 = 2;
	std::cout << rRef1 << std::endl;
	int val = 8;
	int&& rRef2 = std::move(val); //使用std::move将左值所有权转移到右值,但并不改变原变量的所有权
	{
		std::cout << rRef2 << std::endl;
		std::cout << val << std::endl;
	}
	std::cout << val << std::endl;
	std::cout << rRef2 << std::endl;
}
输出:
构造函数!
拷贝构造!
1
拷贝赋值!
1
析构函数!
析构函数!
----------------------------分隔符--------------------------------
2
8
8
8
8
移动构造函数主要用于在对象的拷贝移动操作中实现高效的资源转移,避免不必要的资源拷贝开销。通常在以下情况下使用移动构造函数: 1. 移动语义:当一个对象的资源在拷贝过程中可以被“移动”而不是复制时,可以使用移动构造函数。移动操作比拷贝操作更高效,因为它只是将资源的所有权从一个对象转移到另一个对象,而不是创建新的资源副本。 2. 临时对象:当传递一个临时对象(右值)给函数或返回一个临时对象时,编译器会自动调用移动构造函数。这样可以避免不必要的拷贝操作,提高性能。 3. 容器的扩容:当使用容器(如 std::vector、std::string)时,容器内部的元素在扩容时需要进行拷贝移动操作。如果元素型具有移动构造函数,则在扩容过程中可以使用移动构造函数来避免大量的资源拷贝。 4. 动态内存管理:当使用动态分配的资源(如指针、动态数组等)时,移动构造函数可以在对象进行所有权转移时有效地管理资源,避免内存泄漏或重复释放。 需要注意的是,只有具有可移动语义型(如具有移动构造函数和移动赋值操作符的型)才能进行移动操作。对于不可移动型(如具有禁用移动构造函数或移动赋值操作符的型),将会使用拷贝构造函数进行拷贝操作。 通过使用移动构造函数,可以在适当的情况下提高性能并减少不必要的资源拷贝开销,特别是在涉及大型对象或大量对象的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值