c++ 右值引用,移动语义[进阶必须掌握]

本文深入解析C++中的左值与右值概念,详细阐述右值引用如何减少不必要的拷贝,提高程序效率。并通过实例讲解移动语义在类设计中的应用,展示其在处理临时对象时的优势。

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

前言:

c++ 右值引用确实比较难理解,一遍看不懂,就多看两遍多看几篇,直到掌握为止,一定要掌握

右值引用 这个知识点对提升自己还是比较重要的我认为
1.什么是左值 什么是右值?

c++ 98 中 每个值 不是左值就是右值 2选1
c++ 11 中 分为 左值 ,右值 {存右值,将亡值} 3个 暂且先认为还是2个

ok

有人可能认为等号左边就是左值 等号右边的就是右值 错误太绝对了

通俗讲 能取地址的就是左值

auto i = 0; // i是左值 0是右值
 
int getValue()
{
	auto i = 5;
	return i;
}
auto i = getValue(); //i是左值  getValue()是右值(临时变量)


2.左值引用
int i = 0;
int &a = i;// i是左值,a是左值引用i
a = 10; // 这时i也为10

int& 

在这里插入图片描述

int &i = 10; // 错误 10为右值不能被绑定

const int&i = 10; //正确 这个是特殊的 只要加了const  常量引用既可以绑定左值又可以绑定右值

左值引用只能绑定左值
常量引用既可以绑定左值又可以绑定右值

3.右值引用

右值引用的作用 : 减少不必要的拷贝,提高程序的运行效率

c++ 11 中 右值引用的符号为 &&

int &&a = 10; //正确,现在相当于给10续命了 只要a不死掉,10就死不掉

int i = 10;
int &&a = i;  //错误.右值引用只能绑定右值

看到这里是不是还没发现右值引用的好处,也不是很理解到底是干啥的
继续向下看↓

在这里插入图片描述

看一下这个类的结构
带参构造
拷贝构造
析构

如果不明白拷贝构造 为啥要申请地址请看这一篇 深浅拷贝
https://blog.youkuaiyun.com/weixin_42837024/article/details/99673841

在这里插入图片描述
我向容器中塞入100个persion 每次都要申请释放地址,而且还是一个临时的变量,我后面不再使用它,这没有意义
如果我能够直接的用临时对象已经申请的资源,既能节省资源又能避免不必要的浪费时间
c++ 11 移动语义 就可以解决

4.移动语义

来写一个移动构造
在这里插入图片描述
在这里插入图片描述
看见没 进的移动构造 而不进拷贝构造了 为啥
拷贝构造的参数是 const Persion& p 常量引用
移动构造的参数是 Persion &&p 右值引用
而Persion(“ShenMingYi”)是临时对象,是右值,所以优先进入移动构造,而不是拷贝构造

移动构造与拷贝构造相比还有一个好处:
他没有申请一块新的内存,把对象的内容复制过来
而是直接把指针指向别人的资源,把自己的指针设为nullptr

右值可以优先进移动拷贝,那我是左值会怎样
在这里插入图片描述

完蛋了 左值没法进入移动构造了

别慌!

c++11 提供了一种 把左值 转换为右值的

5.std::move()

在这里插入图片描述

是不是就进入移动构造了

在这里插入图片描述
执行完 move 的s 就是空了 ,相当于直接把自己给了s2,而不是复制一份
其实这时候 s 还没有死 还没有析构,当他出了作用域才会被析构

在这里插入图片描述
但是最好别再使用它了,可能会发生意向不到的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值