左值引用与右值引用

引用

别名,声明时必须初始化,目的是通过引用修改变量值


左值

可以出现在等号左边,能够取地址,有名字,举例:

变量名

int a = 10;//a就是左值

返回值是左值引用的函数调用

int & ...(   )

前置自增自减

++i(对i+1,赋值给i,返回值就是i)

--i(同上) 

赋值运算或复合赋值运算

(i=9)=100;//100

 (i+=10)=1000;//1000 

解引用

A *a = new A();

*a = ...;you

右值 

只能在等号左边不能取地址,没有名字,举例:

字面值

int a = 8;//8就是右值 

返回非引用类型的函数调用

后置自增/自减

i-- = 100(int j = i;i = i-1;return j;)//先拷贝i,然后i+1并赋值给i,返回的是副本

i++ =100; (同上)

算术表达式+、-

a+b 

逻辑表达式&、!= 等

a&&b 

比较表达式

a == b、a>=b 

将亡值

C++11引入的右值引用(移动语义)相关的值类型

将亡值用来触发移动构造或移动赋值构造,并进行堆上资源转移,之后调用析构函数

通过std::move,static_cast<T&&>(x),将左值转化为将亡值(将左值转换为右值,使拷贝变为移动)


左值引用与右值引用的区别

左值引用是对左值的引用;右值引用是对右值的引用

const左值引用能指向左值,局限是不能修改

右值引用通过std::move()可以指向左值

声明出来的左值引用或右值引用都是左值

T&&a=b;//a是右值的引用,具名,a是左值

T&a = b;//a是左值的引用,具名,a是左值

功能差异

左值引用:避免对象的拷贝(传参、函数返回值)

右值引用:实现移动语义、完美转发

移动语义

通过实现移动语义,对象赋值时,避免资源的重新分配,移动构造和移动赋值构造

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值