个人C++笔记(1) 引用(中)(c++中&引用)
在前一篇文章已经讲到引用的作用以及注意事项,接下来我们继续深入学习关于“引用”的知识。
内容三:引用作形参 简化指针修改实参
我们在看到一些代码时会发现用引用作为函数参数。为了了解其中的奥秘可以通过比较的方式加深印象。
第一种情况:值传递 形参无法修饰实参
上图是一个简单的交换函数,很明显形参无法改变实参。换句话说,在main函数中调用这个交换函数,最后在main函数中输出两个值(实参)时会发现根本没有交换。如下图:
最后a=10,b=20。
第二种情况:地址传递 形参可修饰实参
同样作用的交换函数,换成用地址指针进行描述。指针是用来接收地址的。
当调用这个函数后再输出a,b发现两个值进行了交换,不像第一种情况。也就是说形参修饰了实参。
以上两种情况就是我们经常用的传递方式。如今学习“引用”后,我们有了一个新的方法进行传递,那就是“引用传递”。
第三种情况:引用传递 可以说是地址传递的一个特殊简化方式
同样是交换函数,传进去的是引用,不难发现写法与值传递非常相似,却有着和地址传递一样的效果,这也是为什么简化指针的原因。
引用传递作用同地址传递一样,形参会修饰实参。打印输出结果a,b的值会交换。
我们在整体再地看一下引用传递。
分析: 可以看成 int *a=a; int *b=b;相当于起了同样的别名进行修饰 别名可以与原名相同
所以交换别名 实际上也是在交换原名 即交换a,b
总结:引用传递 形参会修饰实参 可以简化指针修改实参
内容四:引用做函数的返回值
注意:不要返回局部变量的引用
结合上面两个图片,得出test01这个方法返回的是局部变量a的引用,在main函数中用ret进行接收。换句话说,ret是局部变量a的别名。
我们知道局部变量是放在栈区的,方法结束后由系统自动释放(第一次保留),因此打印结果如注释所示,第一次正确,第二次乱码。
为了避免这样的事情发生,正确做法:在局部变量前使用static关键字变成静态变量,放在全局区,整个程序结束系统自动释放。
这样无论打印多少次都是ref2=10。
用法:若函数的返回值是引用,该函数调用可以作为左值(等号左边)
上面只是在将引用作为返回值需要注意不能返回局部变量的引用,接下来讲的是其用法。
若某函数的返回值为引用,则该函数调用可以作为左值。
分析:test02() return a 相当于 a=1000;
又因为ref是a的别名,所以后面两个ref2=1000
我们还是需要慢慢将这些知识进行消化,感谢大家的观看与支持!