将"引用"作为函数返回值类型的格式、好处和需要遵守的规则


Posted in 面试题 onFebruary 09, 2016
格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }
好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!
注意事项:
(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。
(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
(4)流操作符重载返回值申明为“引用”的作用:
流操作符>,这两个操作符常常希望被连续使用,例如:cout 例3
#i nclude
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函数值作为左值,等价于vals[0]=10;
put(9)=20; //以put(9)函数值作为左值,等价于vals[9]=20;
cout cout }
int &put(int n)
{
if (n>=0 && n else { cout }
(5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

Tags in this post...

面试题 相关文章推荐
介绍java中初始化块的使用
Sep 11 面试题
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
Sep 11 面试题
关联、聚合(Aggregation)以及组合(Composition)的区别
Feb 29 面试题
广州迈达威.net面试题目
Mar 10 面试题
.NET现在共支持多少种语言
Feb 26 面试题
天网面试题
Apr 07 面试题
C#可否对内存进行直接的操作
Feb 26 面试题
如何利用cmp命令比较文件
Apr 11 面试题
linux比较文件内容的命令是什么
Mar 04 面试题
Prototype如何更新局部页面
Mar 03 面试题
几个判断型的面试题
Jul 03 面试题
如何现实servlet的单线程模式
Aug 05 面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
经典C++面试题一
Nov 06 #面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
Mar 03 #面试题
编写类String 的构造函数、析构函数和赋值函数
Sep 09 #面试题
You might like
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
python实现录音小程序
2020/10/26 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
售后求职信范文
2014/03/15 职场文书
法律专业求职信
2014/05/24 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
杨善洲观后感
2015/06/04 职场文书
消费者理赔投诉书
2015/07/02 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python