左值引用和右值引用

1.左值和右值

左值是一个可以标识并在表达式中使用的对象。简单说,左值就是具有名称且位于内存中的对象或表达式。左值可以出现在赋值运算符的左边或右边,并且具有持久的生命周期。例如,变量、函数返回的左值引用、数组元素、类成员等都是左值。
右值是指没有名称或临时创建的对象,其生命周期仅限于当前表达式。右值通常是一个临时值或表达式的结果。右值不能出现在赋值运算符的左边。例如,字面量、临时对象、表达式的结果等都是右值。

2.左值引用和右值引用

左值引用是指对左值的引用,可以将左值绑定到左值引用上。左值引用通过使用 & 符号声明,并表示对某个具名对象的别名。

int x = 5; int& ref = x; // ref 是对 x 的左值引用。

//左值引用
int a=10;
int &a1=a;//正确,a为左值类型,因为可以我们找到他的地址
int &a=10;//错误,左值引用不能引用一个右值类型的常量,(10是常量,常量为右值)

编译器允许我们对左值建立引用,但不允许对右值建立引用。除非使用常量左值引用操作右值。
右值引用是指对右值的引用,可以将右值绑定到右值引用上。右值引用通过使用 && 符号声明,并表示对某个右值的别名。

int&& rref = 42; // rref 是对临时整数值 42 的右值引用。

//右值引用
int &&a=10;//正确,右值引用一个右值类型
a = 100;
cout << a << endl;//100
 
int var = 10;
int&& var1 = var;//错误,因为无法将右值引用绑定到左值上
//右值引用绝对不能引用左值类型的,加上const也不行,这点是和左值引用不同的地方
const int&& var1 = var//照样报错,加上const也不行
 
//非引用返回的函数返回的都是右值,引用返回的函数返回的是左值
int fun1() { }
int &fun2() { }
int main()
{
	int& z = fun1();//左值引用,报错
	const int& z1 = fun1();//正确
	int&& z2 = fun1();//正确
 
    int& z = fun2();//左值引用,正确
	const int& z1 = fun2();//延长生命期的左值引用,正确
	int&& z2 = fun2();//报错,右值引用不能绑定左值
	const int&& z2 = fun2();//报错
}


3.两者之间的联系

左值引用在汇编层面其实和普通的指针是一样的;定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。左值引用要求右边的值必须能够取地址,如果无法取地址,可以用常引用;但使用常引用后,我们只能通过引用来读取数据,无法去修改数据,因为其被const修饰成常量引用了。
在汇编层面右值引用做的事情和常引用是相同的,即产生临时量来存储常量。但是,唯一 一点的区别是,右值引用可以进行读写操作,而常引用只能进行读操作。右值引用的存在并不是为了取代左值引用,而是充分利用右值(特别是临时对象)的构造来减少对象构造和析构操作以达到提高效率的目的。
为了解决浅拷贝问题,为类提供了自定义的拷贝构造函数和赋值运算符重载函数,并且这两个函数内部实现都是非常的耗费时间和资源(首先开辟较大的空间,然后将数据逐个复制)。在C++11中,我们可以解决上述问题,方式是提供带右值引用参数的拷贝构造函数和赋值运算符重载函数。
程序自动调用了带右值引用的拷贝构造函数和赋值运算符重载函数,使得程序的效率得到了很大的提升,因为并没有重新开辟内存拷贝数据。可以直接赋值的原因是临时对象即将销毁,不会出现浅拷贝的问题,我们直接把临时对象持有的资源赋给新对象就可以了。所以,临时量都会自动匹配右值引用版本的成员方法,旨在提高内存资源使用效率。带右值引用参数的拷贝构造和赋值重载函数,又叫移动构造函数和移动赋值函数,这里的移动指的是把临时量的资源移动给了当前对象,临时对象就不持有资源,为nullptr了,实际上没有进行任何的数据移动,没发生任何的内存开辟和数据拷贝。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值