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


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

面试题 相关文章推荐
什么是接口(Interface)?
Feb 01 面试题
2019年Java 最常见的 面试题
Oct 19 面试题
如何在发生故障的节点上重新安装 SQL Server
Mar 14 面试题
叙述DBMS对数据控制功能有哪些
Jun 12 面试题
linux面试题参考答案(6)
Jun 23 面试题
介绍一下Linux文件的记录形式
Apr 18 面试题
测试驱动开发的主要步骤是什么
Dec 10 面试题
Why do we need Unit test
Jan 03 面试题
软件设计的目标是什么
Dec 04 面试题
介绍一下JMS编程步骤
Sep 22 面试题
Java面试题:说出如下代码的执行结果
Oct 30 面试题
精选干货:Java精选笔试题附答案
Jan 18 面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
经典C++面试题一
Nov 06 #面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
Mar 03 #面试题
编写类String 的构造函数、析构函数和赋值函数
Sep 09 #面试题
You might like
PHP在Web开发领域的优势
2006/10/09 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
php post换行的方法
2020/02/03 PHP
删除重复数据的算法
2006/11/23 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
express.js中间件说明详解
2019/03/19 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
python虚拟环境的安装配置图文教程
2017/10/20 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python简单区块链模拟详解
2019/07/03 Python
简单了解python的内存管理机制
2019/07/08 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
.net笔试题
2014/03/03 面试题
文明教师事迹材料
2014/01/16 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
店长岗位职责
2015/02/11 职场文书
期末个人总结范文
2015/02/13 职场文书
体检通知范文
2015/04/21 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
Oracle使用别名的好处
2022/04/19 Oracle