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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通