c++中引用的定义:引用为对象起了另外一个名字,通过将声明符写成&d的形式来定义应用类型,其中d是声明的变量名。(所以的实例均是在vs2013下)
举个例子来说:b是a的引用,即int a=10;int &b=a;通俗的来说b就是a的另一个名字,b和a公用一块内存空间。
注意:定义引用是一定要进行初始化。
2.一个变量可以有多个引用 (就好像一个人有好几个不同的称呼,但实际上都是一个人)
3.引用做返回值
在了解这个知识点之前需要知道 函数在值传递的时的操作
在Add函数中执行完之后 内存为Add创建的函数栈帧会被释放 c中的值会被储存在一个临时变量中(如果数据很小会储存在寄存器中否则会存到内存中)
如果用引用作为返回值
当前代码的问题:
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的值就变成了随机值。
引用作为返回值在一些场景可以提高性能