【UE C++】

文章探讨了C++中的移动语义,包括右值、右值引用的概念,以及std::move()的作用。移动构造和移动赋值运算符用于提高效率,通过直接转移资源所有权而非拷贝。文章还强调了当类包含不可移动的成员(如引用、const或需要特殊处理的指针)时,移动操作的注意事项,并提供了一个示例来展示如何防止移动后产生野指针的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动

右值

右值指临时值,如 i * 10 或 函数返回值 等 即将消亡的值 ,在传递这些值时,一般会对内容进行拷贝,然后右值再销毁。但如果直接把本该销毁的空间直接占为己有,便会提高效率

右值引用

形如 int&& i;

std::move()

move可以将右值进行移动赋值如 i = move(a * 10);

移动构造

//移动构造,第一个参数为该类型右值引用
A(A&&);

移动赋值运算符

A& operator=(A&&);

注意事项

  1. 如果一个类型显式构造了拷贝构造函数,那么编译器将不会合成移动构造函数。相反如果类没有定义任何拷贝控制操作,且数据均可进行移动,那么编译器会合成移动操作
  2. 类有成员为引用,const,则移动操作被定义为删除
  3. 成员指针复制时,记得将原对象指针置空,防止释放而产生野指针,如下代码中的 char* c
#include<iostream>
using namespace std;
struct A {
	int num;
	char* c;
	A(){}
	A(A&& a)
	{
		this->num = a.num;
		this->c = a.c;
		a.c = nullptr;
	}
	~A()
	{
		delete c;
	}
};
A GetA()
{
	A a;
	a.c = new char;
	*a.c = 'c';
	return a;
}
int main()
{
	A m_a = GetA();
	cout << *m_a.c << endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值