0

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

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

大多数时候我都看到了上述格式,而不是将其作为参考返回。

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

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

4

2 回答 2

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;
}

第二个版本通过值传递一个参数,从而使代码更简单,并使编译器有更多机会省略临时副本。

于 2012-11-30T07:04:36.980 回答
0

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

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

于 2012-11-30T07:01:13.690 回答