c++基础语法——引用

c++中引用的定义:引用为对象起了另外一个名字,通过将声明符写成&d的形式来定义应用类型,其中d是声明的变量名。(所以的实例均是在vs2013下)
在这里插入图片描述
举个例子来说:b是a的引用,即int a=10;int &b=a;通俗的来说b就是a的另一个名字,b和a公用一块内存空间。
注意:定义引用是一定要进行初始化。
在这里插入图片描述

2.一个变量可以有多个引用 (就好像一个人有好几个不同的称呼,但实际上都是一个人)在这里插入图片描述
3.引用做返回值
在了解这个知识点之前需要知道 函数在值传递的时的操作
在这里插入图片描述
在Add函数中执行完之后 内存为Add创建的函数栈帧会被释放 c中的值会被储存在一个临时变量中(如果数据很小会储存在寄存器中否则会存到内存中)
Add函数的栈帧(反汇编)

如果用引用作为返回值
在这里插入图片描述
当前代码的问题:
1.存在非法访问,Add栈帧销毁以后,还去访问c位置的空间。
2.此时如果栈帧被销毁的同时清理内存空间,那么此时返回的c就为返回值,如果Add
栈帧的内存没有被清理或者占用,那么c的可能是正确的

听完上面的讲解可能还是云里雾里,那么下面再来举个例子
在这里插入图片描述
ret是c的引用,可以看到我们除了刚开始在初始化ret,并没有其他任何改变的它值的操作,按道理来说应该输出3,3 来看一下实际的结果
在这里插入图片描述
这个三十是哪来的呢?有人可能发现了
在这里插入图片描述
接下来分析一下:

1.当第一个Add函数执行完毕以后,Add的函数栈帧被销毁,但VS编译器并没有清理内存,ret访问到的内存空间虽然是非法的,但依然是正确的值。
2.到第二个Add函数执行时,Add函数栈帧中 int c所在内存空间的值被修改成30,之后和第一个Add函数销毁是情况相同,所以ret访问到的值为30。
3.细心的人可能发现了一些问题,前文中写了Add函数原来的内存会被覆盖,但为什么在执行完cout流输出函数之后没有被覆盖呢?
在这里插入图片描述
cout函数覆盖到A,B内存的位置 并没有覆盖到C,所以C处内存的值还是没有被改变
4.在举一个被覆盖的例子
在这里插入图片描述
这次printf函数就将原来Add函数栈帧位置的内存给占用了,原来c的值就变成了随机值。
引用作为返回值在一些场景可以提高性能
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值