在运算符重载的情况下处理悬空指针/引用

时间:2012-11-30 06:57:09

标签: c++

在运算符重载期间始终编写自己的复制构造函数是否安全?

Complex Complex::operator+(const Complex&  other)
{
    Complex local ;
    local.result_real = real + other.real;
    local.result_imaginary = imag + other.imag;
    return local ;
}

我大部分时间都看过上面的格式,而不是将其作为参考。

我们可以像拇指一样吗         1-始终通过引用传递函数参数。         2-始终通过引用返回对象。

在运算符重载中是否有任何特殊情况我们必须仅按值返回对象?

2 个答案:

答案 0 :(得分:1)

  

我们可以采用拇指规则,例如1-始终通过引用传递函数参数。 2-始终通过引用返回对象。

不,不是真的。即使您找到了返回非悬空引用的方法,添加操作也不应返回引用,因为这没有意义。 a+b应该返回一个新对象,而对于a+=b,返回对LHS的引用是有意义的。

关于通过引用传递论据,也没有经验法则。考虑一下:

A operator+(const A& lhs, const A& rhs)
{
  A tmp = lhs; // explicitly make a copy
  return tmp += rhs;
}

和此:

A operator+(A lhs, const A& rhs)
{
  return lhs += rhs;
}

第二个版本按值传递一个参数,从而使代码更简单,并为编译器提供更多机会来删除临时副本。

答案 1 :(得分:0)

对于某些操作符,您应该返回一个引用,对于其他不应该返回的引用,还有一些操作符完全返回其他类型(如比较运算符)。

在你的情况下,你不应该。特别是因为您将返回对 local 变量的引用,该变量在函数返回时无效。