一级棒(Eachfun)
偷猫的个人主页
一级棒(Eachfun) - 读书笔记 - C++ Primer - 函数的引用返回值
RSS订阅
函数的引用返回值
发表时间:2006-07-30 01:45:00 关键词:C++,MFC,VC,Primer,编程,教程,读书

  引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递。它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数的返回值是一个引用,那么,如上文所说,它会节约一组构造、赋值和析构过程。但是,函数返回引用往往会带来一些意想不到的错误:比如返回临时变量的引用。
//一个错误的函数
int &Max(int i, int j)
{
  return i>j ? i : j;
}
  以上函数的错误在于,i和j在函数结束后会被释放。对它们的引和也将失效。如果用这个返回值给别的变量赋值,将会获得一个垃圾。VC++.Net会对以上return语句显示警告。
  那么,如果返回一个全局变的引用呢?这当然是可以的,但是,一来程序设计中不建议使用过多的全局变量,二来全局变量即使不返回也可以访问。这样做的唯一用途就是把函数做右值来给其它变量赋值。
int m;//全局变量
int &MaxByGlobal(int i, int j)
{
  return m = i>j ? i : j;
}
int a, b, c;
c = MaxByGlobal(a, b);//用法一、用返回值赋值
MaxByGlobal(a, b); c = m;//用法二、不用返回值赋值
  当然,以上这个MaxByGlobal函数也不是一无是处,能用返回值来进行赋值会给程序带来更好的可读性。只是这样的函数设计本身不被建议。
  那么,函数返回引用用得最多的就是返回形参了。因为形参可以用引用传递,引用的形参不是函数内部的局部变量,这样做是可取的:
int &MaxByRef(int &i, int &j)
{
  return i>j ? i : j;
}
  上面这个函数和上文中的“int Max(int i, int j)”函数如此相似,但是它省去了三次构造、赋值和析构。
  另外一种用法就是在类的成员函数中返回类对象自身了,典型的是“operator +=”函数之类。
MyClass &MyClass::operator +=(const MyClass &other)
{
  //某些语句
  return *this;
}
  以上函数返回的是自身的引用。因为类的成员函数也可以写成全局函数“MyClass &operator +=(MyClass &Left, const MyClass &right)”,而且在类成员函数的调用中实际存在着this指针的传递。所以,以上这个函数依然可以看作返回了形参的引用。
  对于返回引用的函数,还有一个好玩的现像。即返回值还可能可以被赋值。如“(a += b) = c;”这样的形式。这种写法明显不伦不类,但是如果函数返回了非const的引用,这个表达式的确是合理的。所以,上面的“operator +=”函数还要修改一下,将返回值由“MyClass&”改为“const MyClass&”。
  返回引用并不是处处可用的,正如《引用传递的应用范围》中提到的一样:不能用引用来传递临时值。有时候我们的确要产生一个临时对象并返回它,那就不能返回引用。典型的有“operator +”函数:
const MyClass MyClass::operator +(const MyClass &other) const
{
  MyClass Temp;
  //某些语句
  return Temp;//这里只能返回对象,因为Temp必须是局部变量
}

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
  • 写的真不错啊!谢谢了
    personhongqi link未填 QQ35039828 email未填 时间:2010-06-23 14:42:00
  • 您好!我是一名学生,今天无意中搜索到您的博客,这两天在看c++中的函数,被其中的实参形参弄得晕头转向,还有引用,感觉这跟c差别蛮大,看到您的文章我如获至宝,太好了!真的感谢你,以后的学习中,如果有不懂的就可以随时到您的读书笔记上解惑了呵呵!
    person子虚 link未填 QQ531330799 email未填 时间:2009-12-30 19:45:00
1
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2011 Eachfun.Com, All Rights Reserved 一级棒网络
备案号忘了带来
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!