5.2 引用做函数返回值
引用做返回值
引用做返回值时
可在函数外面修改函数里面的内容
前提是引用的变量出了函数不会销毁
static int n = 0; int& Count() { n++; n++; return n; } int& tmp = Count(); tmp = 20; cout << tmp << ' ' << n;
由于局部变量出了作用域会销毁
所以这里在函数中定义的是静态变量
并且修改tmp的值会改变n的值
6. 注意事项
下面这段代码不能用传引用返回:
int& Add(int a, int b) { int c = a + b; return c; }
因为函数调用完后C就被销毁了
而将C的引用返回后
会有类似于使用野指针的风险
总结:
如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
7. 传值和传引用效率分析
- 作为函数返回值的比较
- 传值返回分析
首先,传值返回并不是单纯的将
返回值直接传给外面的变量
而是会生成一个中间变量的拷贝
这个中间变量再将值拷贝给外面的变量
(注:在栈帧创建与销毁有详细介绍)
画图理解:
然而传引用返回没有这么复杂的过程
综上所述:
因此用值作为参数或者返回值类型
效率是非常低下的
尤其是当参数或者返回值类型非常大时
效率就更低
8. 引用和指针的联系
它们的联系:
- 语法层面上
引用在语法概念上就是一个别名
和实体共用一份空间
- 底层实现上
引用在底层实现上是有空间的
因为引用是按照指针的方式来实现的
也就是指针的底层汇编和引用一样
左边为引用,右边为指针:
9. 引用和指针的区别
- 引用概念上定义一个变量的别名,指针存储一个变量地址。
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
10. 总结以及拓展
总结:
总的来说,C++中更喜欢用引用
特别是在一些容器中,如:栈,队列
使用引用的效率会提高许多
在类和对象中引用也是重量级的存在
所以说引用十分的重要!
拓展:
C++中的空指针不用NULL
而是用nullptr来替代
(nullptr是关键字,使用时不用包头文件)
为了提高C++代码的可读性
在后续表示指针空值时
建议最好使用nullptr。
🔎 下期预告:内联函数和auto关键字 🔍