C++引用详解

目录

什么是引用?

引用作为返回值?

传值返回:

引用返回:

引用的价值:

引用和指针的区别:用法和语法的角度

语法方面:

底层:


什么是引用?

很简单,记住,引用就是别名

例如,李逵的别名叫黑旋风

此处a的别名叫做b,就这么简单

引用作为返回值?


返回变量出了函数作用域,其生命周期就结束了(尤其是局部变量),所以不能用引用返回
如果返回值是一个引用,那么当函数结束的时候,如果函数栈帧也跟着销毁了,那么返回值就是一个随机值,此时,就是一个典型的野引用
如果函数栈帧没有被销毁,那么就是先前的值,而函数栈帧是否被销毁是随机的,根据编译器的不同决定,这是不可控的
总之,把函数的返回值设置为一个引用是十分不靠谱的

传值返回:

事实上是返回了返回变量值的拷贝,在函数栈帧销毁前,会把变量拷贝到寄存器中,返回的变量实际上是寄存器中的拷贝

引用返回:

事实上是返回返回变量的别名,而变量在函数栈帧销毁时也跟着被销毁了,所以返回值就出问题了,这个名字没有了具体的东西,变成了野名字,即野引用

引用的价值:

1、做参数(例如二级指针)
2、做返回值(1、修改返回对象 2、减少拷贝提高效率)

那么,什么情况下可以使用引用返回值?
由于以上的问题,全局变量、静态变量、堆区变量就可以使用引用返回
返回值使用引用,就是返回变量的别名,可以通过这个别名直接访问到该返回值,可以进行读写

引用和指针的区别:用法和语法的角度


语法方面:


1、引用是别名,不开空间;而指针是地址,需要开辟空间(但是实际上,语法上不开空间,但是底层是开空间的,即引用到了底层(汇编阶段)依旧是使用指针实现)
语法含义和底层实现是背离的
2、引用必须初始化,而指针没有硬性要求(指针更容易出现野指针)
3、引用不能改变指向,而指针可以
4、没有空引用(因此,引用相对更安全,不容易出现野引用;而指针会有空指针)
5、sizeof的引用是引用类型的大小,指针永远是4个字节(32位环境下)
6、++的时候,指针要根据指针类型决定偏移量;但是引用是别名,就是对引用的对象进行++
7、引用访问不需要解引用,但是指针需要
8、引用没有多级引用,但是指针有多级指针。多个引用,只是同一对象取了更多的别名,仅此而已

底层:

即汇编层面,实际上没有引用,都是指针,引用在进行编译后就换成了指针进行实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二十5画生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值