【问题标题】:Overload += operator if + is overloaded? [duplicate]如果 + 重载,则重载 += 运算符? [复制]
【发布时间】:2010-08-19 20:33:32
【问题描述】:

可能重复:
Overloading += in c++

如果我重载 + 是否需要重载 += 运算符,或者编译器会知道该怎么做?

谢谢。

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:

你需要重载两者。

但是,如果您颠倒顺序,您可以重复使用您的代码:

struct foo
{
    // this is the "core" operation, because it's mutating (changes this)
    foo& operator+=(const foo&)
    {
        // ...
        return *this;
    }

};

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

您制作一个副本,对该副本进行操作,然后返回它。

【讨论】:

  • 我不相信你最后的说法是真的。在operator+ 的情况下,在函数内部复制往往会导致总体上的副本减少。规范形式(恕我直言)应该是:foo operator+(const foo& lhs, const foo& rhs) { foo ret( lhs ); ret += rhs; return ret; }
  • 我喜欢 Charles Suggested 的表格,因为它对我来说更清晰。但我相信 GMan 使用的形式可以让编译器更轻松地进行 RVO。所以我想我只需要习惯这种新形式(直到编译器赶上我才能回到旧形式)。
  • 我取决于很多因素,但除非编译器使用 operator+= 的内部结构(而不​​是仅仅将其用作直接函数调用),否则我的表单将导致比按值版本传递第一个参数。有几个因素在起作用。首先,从函数签名中,调用者无法知道它为参数制作的最佳副本可能是返回值;这在函数内部是已知的。其次,虽然operator+= 返回一个引用,但签名本身并不要求它是*this,即使我们知道它应该是。
  • @Charles:我不确定我是否跟上了。我的表单在参数中创建一个副本,然后在返回时创建一个副本。您的表单在正文中创建一个副本,然后在返回时创建一个副本。我们有相同数量的副本,除了我的表格允许在 lhs 是临时的时省略副本。是的,我除了完整的定义可用,或者使用相对现代的编译器进行链接时优化。
  • 您的表单允许在可以就地构建副本时省略in。我的表格允许 RVO;你的没有(没有额外的 copmiler 知识),因为调用者复制了参数(好的,可能不是副本)并且不知道它将被复制到返回值。我使用最近的 gcc (IIRC >4.2.0) 进行了调查,但没有发现我的表单制作了更多副本的情况。这并不意味着我不认为按值传递总是一个坏主意;我相信它在(例如)复制和交换中效果很好。
猜你喜欢
  • 2011-10-27
  • 2014-02-25
  • 2015-06-20
  • 2017-01-29
  • 1970-01-01
  • 2011-11-12
  • 2012-12-22
  • 2016-09-26
  • 2018-06-01
相关资源
最近更新 更多