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


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

面试题 相关文章推荐
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
Oct 05 面试题
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
Sep 15 面试题
struct和class的区别
Nov 20 面试题
经典c++面试题五
Dec 17 面试题
上海天奕面试题笔试题
Apr 19 面试题
初级软件工程师面试题 Junior Software Engineer Interview
Feb 15 面试题
维德科技C#面试题笔试题
Dec 09 面试题
C#如何进行LDAP用户校验
Nov 21 面试题
Linux操作面试题
May 16 面试题
Python如何定义一个函数
Sep 01 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
Mar 30 面试题
解释i节点在文件系统中的作用
Nov 26 面试题
在什么时候需要使用"常引用"
Dec 31 #面试题
经典c++面试题三
Jul 08 #面试题
经典c++面试题二
Aug 14 #面试题
将"引用"作为函数参数有哪些特点
Apr 05 #面试题
经典C++面试题一
Nov 06 #面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
Mar 03 #面试题
编写类String 的构造函数、析构函数和赋值函数
Sep 09 #面试题
You might like
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
php动态绑定变量的用法
2015/06/16 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
javascript实现拼图游戏
2021/01/29 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
Python简单读取json文件功能示例
2017/11/30 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
python 字典访问的三种方法小结
2019/12/05 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
网络技术专业推荐信
2014/02/20 职场文书
好学生评语大全
2014/05/05 职场文书
求职信的正确写法
2014/07/10 职场文书
工作检讨书500字
2014/10/19 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers