左值引用和右值引用

一 左右值的概念和区别

1.概念

左值:左值是一个表示数据的表达式,比如:变量名,解引用的指针变量。一般的,我们可以获取它的地址,对他赋值。但是如果被const修饰以后就不能对它赋值,但是可以获取地址。左值可以出现在赋值符号左边也可以出现在赋值符号右边。

以下a,*p,b都是左值

int a=3;
int*p=&a;
const int b=2;

右值:右值是一个表示数据的表达式,比如:字面常量,表达式返回值,传值返回函数的返回值。注意,右值不能出现在赋值符号左边,只能出现在右边,也不能对它进行取地址。

以下都是右值

int x=3,y=4;
10;//常量
x+y;//表达式返回值
fun(x,y);//传值返回函数的返回值

2.区别

区分左值和右值,还是要看能否取地址。左值可以对其取地址,右值不能对其取地址。

二 左值引用与右值引用

1.左值引用

左值引用就是对左值的引用,给左值取别名,通过&来声明

以下是对上面左值的左值引用

int&q=a;
int&r=*p;
const int &z=b;

2.右值引用

右值引用就是对右值的引用,给右值取别名,通过&&来声明

一下是对上面右值的右值引用

int&& a1=10;
int&& a2=x+y;
int&& a3=fun(x,y);

三 对比与总结

左值可读可写,右值可读不可写。所以左值引用不能引用右值,这会使权限放大。但是const修饰左值时,就可以保证被引用的数据不会被修改,所以const左值引用可以引用右值

int a=10;
const int ca=20;
const int& b=a;//const引用,引用普通左值
const int& c=ca;//const引用,引用const左值
const int& d=30;//const引用,引用右值
cout << b <<","<< c <<","<< d <<endl;//都能读

而右值引用只能引用右值,不能引用左值以及const左值

右值不可以取地址,但是右值取别名后,会导致右值被存储到特定位置,且可以取到该位置的地址,就可以对其进行修改

int&& e=a;//error,右值引用,不能引用左值
int&& f=ca;//error,右值引用,不能引用const左值
int&& g=30;//右值引用,引用右值
g=300;//右值引用,可以修改
cout << g <<endl;//300

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值