【问题标题】:Handling Dangling pointer/reference in case of operator overloading在运算符重载的情况下处理悬空指针/引用
【发布时间】:2012-11-30 06:57:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的意思是:永远不要通过引用返回(除非您确切知道自己在做什么)。
  • 这取决于您重载的运算符,请参阅Operator overloading,它将回答您的所有问题等等。
  • 通过引用返回本地将导致未定义的行为。您可以通过引用返回对象的唯一情况是:1)您通过方法返回当前对象。 2) 你创建一个新对象并返回它的引用,在某处处理它的删除。

标签: c++


【解决方案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;
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2011-12-21
      • 1970-01-01
      • 2019-02-15
      • 2015-01-28
      • 2018-04-09
      相关资源
      最近更新 更多