C++右值引用

右值引用

目录

右值引用

前言说明:

1、左值和右值的概念

2、引用

3、左值引用和右值引用

左值

右值(作用是实现移动语义和完美转发)

移动语义

移动语义定义:

强制移动:move()

C++中特殊的成员函数

前言说明:

最近修改时间:2022年11月3日22:52:13

作者:黎雪途

1、左值和右值的概念

         左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体
         右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。【右值可以理解为临时变量
         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址

2、引用

        引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。

        引用可以改变指针的指向,还可以改变指针所指向的值。

        引用的基本规则:

  1. 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义
  2. 对引用的一切操作,就相当于对原对象的操作。

3、左值引用和右值引用

    3.1 左值引用
         左值引用的基本语法:type &引用名 = 左值表达式;

    3.2 右值引用

        右值引用的基本语法type &&引用名 = 右值表达式;

        右值引用在企业开发人员在代码优化方面会经常用到。

        右值引用的“&&”中间不可以有空格。

左值

一个表示数据的表达式,左值是一个可以&取地址的量

Int a = 10;

&a;

左值阴影要求右边的值必须可以获取地址,如果无法获取地址,可以使用常引用

使用const常引用之后,我们只能通过引用来获取数据,无法修改数据

右值作用是实现移动语义和完美转发

右值包括字面常量,不是左值的量就是右值

右值符号:&&

 

不是左值:x+y

 

移动语义

// C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。

// 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。

/*

右值引用是用来支持转移语义的。

转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。

转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝,当我们将文件从一个目录拷贝到另一个目录时,速度比剪切慢很多。

通过转移语义,临时对象中的资源能够转移其它的对象里。

移动语义定义: 

在现有的 C++ 机制中,我们可以定义拷贝构造函数和赋值函数。

要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。

对于右值的拷贝和赋值会调用转移构造函数和转移赋值操作符。

如果转移构造函数和转移拷贝操作符没有定义,那么就遵循现有的机制,拷贝构造函数和赋值操作符会被调用。

普通的函数和操作符也可以利用右值引用操作符实现转移语义。

强制移动:move()

通常移动构造函数和移动运算符使用右值,但一定要他们使用左值的时候,使用move()

C++中特殊的成员函数

默认构造函数

拷贝构造函数

拷贝赋值函数

移动构造函数

移动复制函数

析构函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LL大个仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值