Toriyung

导航

C++新知识点:引用


讲引用还是绕不开左值右值

简单来说左值就是有属于自己的内存地址(持久的值),可以用来修改操作,但右值就是一个临时的变量(其实还有其他的,如将亡量等,总之就是不是一个持久的值),没有自己的内存地址

 

C++11之前只有左引用

  左引用相当于是指针的别名,编译器编译时会将引用替换成指针,所以不需要有自己的内存地址

 

C++11之后加入了右引用

  右引用则是对右值取别名,这样则可以拿作为变量来使用,如移动语义等。

  其原理仍是在编译层面分配内存空间并修改为右值

 

-----------------------------------------------------------------------------以下是之前的笔记,针对左引用---------------------------------------------------------------------------------------------------

定义一个(左)引用,等效于另一个变量

 

用法

int a = 10//定义变量a=10
int &b = a;  //定义引用b = a

 

注意

  1. 引用必须初始化

  2. 引用不可变动(不能引用a后又变成引用c)

 

本质

本质上是指针常量

int &b = a;

上面语句本质上是

int * const b = &a;

可以看到是a的地址,但有限定词const所以b只能指向初始化时的a的地址,不可更改引用的对象

 

这里给出一个平常常用的替换:

void Widget::handleKBsignals(const QByteArray& kb)
void Widget::handleKBsignals(QByteArray kb)

 

 

 

引用某种程度上可以理解为为了在表面上更加符合人类的直觉思维,用一个变量的别名(仍旧是变量,所以阅读容易)去实现指针(带*,阅读难)的效果,作为参数进行传递更加方便。其实就是语法糖

 

 

 -----------------------------------------------------------------------------以下是新的笔记,针对移动语义---------------------------------------------------------------------------------------------------


深拷贝将重新分配内存空间,将所有原对象信息一一复制进去,显然这会造成大量资源需求

浅拷贝不会拷贝内存内的信息到新的内存空间,而是简单复制引用和指针信息,这样一来二者公用同一个内存空间,可能造成内存冲突

移动操作(移动构造,移动赋值)个人认为类似于浅拷贝,在其基础上将原对象对内存空间的指向给重置了,也就是说新对象接管了原先的内存空间,原对象对内存空间“放手”,这样做好处是对于原对象只是为了临时使用,在使用后就不需要的时候,可以节省了中间左值的创建,如将两个右值相加并push入集合1,如果先定义对象1,将计算结果赋给对象1然后对象1再push入集合1,那么势必会造成拷贝过程出现的资源浪费。如果使用移动操作,则是将右值引用直接移动给集合1。

 

std::move。上面提到的移动操作就是将右值引用直接转移给新对象,如果需要转移的值是左值,则可以使用move()进行强制转换为右值

 

 

完美转发以后需要用到模板再学习..

 

参考:

https://zhuanlan.zhihu.com/p/568637296

https://zhuanlan.zhihu.com/p/455848360

https://www.cnblogs.com/KillerAery/p/12802771.html

https://www.bilibili.com/video/BV1xP411e75w/?spm_id_from=333.337.search-card.all.click&vd_source=a79f8b058df1ea4087f67b7e1bf84bb2

 

posted on 2022-08-11 14:53  Toriyung  阅读(23)  评论(0编辑  收藏  举报