函数的引用返回值

引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递。它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数的返回值是一个引用,那么,如上文所说,它会节约一组构造、赋值和析构过程。但是,函数返回引用往往会带来一些意想不到的错误:比如返回临时变量的引用。
//一个错误的函数
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必须是局部变量
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值