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


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...

面试题 相关文章推荐
怎样声明接口
Sep 19 面试题
空字符串(“”)和null的区别
Nov 13 面试题
C语言如何决定使用那种整数类型
Nov 26 面试题
上海奥佳笔试题面试题
Nov 16 面试题
说一下mysql, oracle等常见数据库的分页实现方案
Sep 29 面试题
介绍一下SQL中union,intersect和minus
Apr 05 面试题
什么是三层交换,说说和路由的区别在那里
Sep 01 面试题
可以使用抽象函数重写基类中的虚函数吗
Jun 02 面试题
介绍一下Make? 为什么使用make
Jul 31 面试题
主要的Ajax框架都有什么
Nov 14 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
Jul 30 面试题
Java servlet面试题
Mar 04 面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
经典C++面试题一
Nov 06 #面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
Mar 03 #面试题
编写类String 的构造函数、析构函数和赋值函数
Sep 09 #面试题
You might like
Php Cookie的一个使用注意点
2008/11/08 PHP
php 图片上传类代码
2009/07/17 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python中用format函数格式化字符串的用法
2015/04/08 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
django允许外部访问的实例讲解
2018/05/14 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
django 自定义过滤器的实现
2019/02/26 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
经济管理专业毕业生推荐信
2013/11/11 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
党员争先创优承诺书
2015/01/20 职场文书
质检员工作总结2015
2015/04/25 职场文书
2016年母亲节寄语
2015/12/04 职场文书