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


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

面试题 相关文章推荐
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
May 24 面试题
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
Jul 17 面试题
广州御银科技股份有限公司试卷(C++)
Nov 04 面试题
如何打印出当前源文件的文件名以及源文件的当前行号
Apr 05 面试题
Oracle快照(snapshot)
Mar 13 面试题
请解释virtual关键字的含义
Jun 17 面试题
Linux如何命名文件--使用文件名时应注意
Jan 22 面试题
Linux如何为某个操作添加别名
Feb 05 面试题
介绍一下linux的文件权限
Jul 20 面试题
广州足迹信息技术有限公司Java软件工程师试题
Feb 15 面试题
什么是GWT的Module
Jan 20 面试题
如何清空Session
Feb 23 面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
经典C++面试题一
Nov 06 #面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
Mar 03 #面试题
编写类String 的构造函数、析构函数和赋值函数
Sep 09 #面试题
You might like
php 无极分类(递归)实现代码
2010/01/05 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
浅谈php调用python文件
2019/03/29 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Sanic框架路由用法实例分析
2018/07/16 Python
python 提取文件指定列的方法示例
2019/08/07 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
html5绘制时钟动画
2014/12/15 HTML / CSS
小学数学教研活动总结
2014/07/01 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
导游词400字
2015/02/13 职场文书
2015年超市工作总结
2015/04/09 职场文书
早会开场白台词大全
2015/06/01 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
go goth封装第三方认证库示例详解
2022/08/14 Golang