C++11新特性——右值引用

左值与右值

在这里插入图片描述

什么是左值和右值?

  • 简单的从名字出发来讲的话,左值,是可以出现在等号左边的,当然他也可以出现在右边,右值,是只能出现在等号右边的,是只能。
  • 从特点上来说的话,左值是可以取地址的,有名字的,用户能够改变值的量,比如说常见的变量或者类对象,左值具有持久的状态,在离开作用域的时候才销毁。
  • 而右值是不能取地址没有名字的量,或者即将销毁的量,在C++11后具体定义了两种右值,第一种纯右值运算表达式产生的临时变量、不和对象关联的原始字面量非引用返回的临时变量都是纯右值;第二种是将亡值,也就是即将要销毁的值,比如临时对象,或者就是我们自己认为的以后不会再用到的值,但是这种值需要通过move手动转为右值。这两种都属于右值。
  • 但是在学习过程中也有遇到有意思的东西,比如标准库中的string就不符合右值的定义,比如前面说的右值是只能放在等号右边的,但是如果三个字符串s1,s2和s3,我却可以这样写s1+s2=s3,s1+s2是一个运算表达式,返回是值传递,应该是一个临时对象右值却能放在等号左边,我一开始以为编译器只能检查自带的类型是否为右值,但是对s1+s2取地址的时候,编译器却能提醒我这是一个右值,所以原因在其他,当然最后发现其实很简单,看string的源码就知道,甚至可以说不用看也能想到,string的等于号肯定是重载过的了,当我们写出s1+s2 = s3的时候,实际上应该翻译成(s1+s2).operator=(s3),也就是这个临时对象调用operator=这个函数,参数是s3,临时对象调用函数当然没有左值右值的限制,所以编译成功,当然这只是我学习过程中遇到的一个小问题,

什么是右值引用,为什么要引入右值引用?

  • 在C++11以前是没有右值引用这个概念的,以前的引用就是左值引用,也就是引用只能引用一个左值,当你想给一个常量取别名的时候会报错,要想引用右值只能使用常量引用。
  • 而在C++11引入了右值引用,专门引用右值,用法是用两个取地址符号来获得右值的引用,右值引用是为了支持移动操作而引出的一个概念,移动操作主要的目的是避免了不必要的拷贝,提高性能。通常如果类成员包含指针或者堆空间的申请时,我们会设计一个深拷贝,在拷贝的时候申请新的空间,防止两个指针指向同一个地方,重复delete,然而如果我们拷贝的对象本身就是一个右值,或者说是一个将亡值,一个临时对象,他自己的那个空间他以后也用不到了,所以直接让我们的指针指向它的那块内存,让我们接管那块内存,就节省了一个开辟空间拷贝的过程。其实说到底,移动构造本质就是一个浅拷贝,不过要注意的是,接管右值的内存是要记得把它的指针置空,不然就会出现浅拷贝的问题,重复delete。
  • 所以右值引用的引入就是为了解决冗余拷贝的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值