C ++ - 如何重载operator + =?

时间:2011-01-03 03:55:04

标签: c++

给出以下代码片段,

class Num
{
public:
    Num(int iNumber = 0) : m_iNumber(iNumber) {}

    Num operator+=(const Num& rhs)
    {
        this->m_iNumber = (this->m_iNumber + rhs.m_iNumber);
        return *this;
    }
private:
    int m_iNumber;
};

//===========================================================
int _tmain(int argc, _TCHAR* argv[])
{
    Num a(10);

    Num b(100);

    b += a;

    return 0;
}

我想知道如何正确地重载operator+=

问题:

  1. 如何定义此运算符的签名?特别是,什么应该用于返回值?

  2. 如何实现功能体?

  3. 如何使用此重载运算符?

  4. 我已经提供了上述解决方案,但我担心这是不正确的。

6 个答案:

答案 0 :(得分:30)

通过引用返回会更好

Num& operator+=(const Num& rhs){

      this->m_iNumber += rhs.m_iNumber;
      return *this;
}

答案 1 :(得分:7)

如果您关注this Wikibook,您将通过示例找到这些答案:

  1. Type& operator+=(const Type& right)是正确的签名。
  2. 你做对了。
  3. 您使用重载运算符就像普通运算符一样,只使用您的类型。这就是练习的重点。 ;)
  4. 注意作为一个附加点(你做对了),复合赋值运算符必须是成员函数。

答案 2 :(得分:4)

任何赋值运算符的签名(operator =或operator @ =为您最喜欢的运算符@)应为

Class& operator @= (const Class& rhs);

也就是说,该函数通过const引用获取其参数(因为它不会修改它),然后返回对该对象的可变引用。返回非const引用的原因是,由于历史原因,您可以编写如下代码:

(a += b) += c;

这绝不是好的风格,但它适用于整数,所以你应该努力使它适合你的类型。

至于你的功能,你所拥有的是完全正确的。但是,一般情况下,即使参数是接收器对象,也应确保代码正常工作。例如,如果您编写类似

的内容
a += a;

这会被翻译成

a.operator+= (a);

因此代码将在参数和接收器都是同一对象的情况下运行。这通常不适用于复合赋值运算符(通常只有operator=需要担心这一点),但在某些情况下,如果你不小心,你可能会被烧掉。

最后,您可以像使用上面的示例代码一样使用此operator +=函数。使用+=会自动调用它。

希望这有帮助!

答案 3 :(得分:3)

您的示例完全正确:http://codepad.org/PVhQw9sc

  1. 您可以将返回值定义为您想要的任何值。如果您希望它与int匹配,则需要返回Num&类型,并返回值*this
  2. 你做得对。
  3. 你也做得对。

答案 4 :(得分:2)

像你一样写下身体。像你一样使用运算符。操作员应返回允许链接的引用。

请参阅here

答案 5 :(得分:0)

您的操作员功能也可以写为

Num& operator += (const Num& rhs)
{
   m_iNumber += rhs.m_iNumber;
   return m_iNumber;
}
在成员函数中,

*this->m_iNumberm_iNumber本身是相同的,并且在我看来,使用以前的格式更加打字。