如何在operator + =中调用operator +

时间:2014-01-18 14:05:59

标签: c++ operator-overloading

以这种方式定义operator + =是对的吗?

void operator +=(const BigNumber& other)
{
    *this=(*this) + other;
}

在这样的课程中:

class BigNumber
{
public:
   //....
    BigNumber operator +(const BigNumber& other)
    {
        return sum(other);
    }

  //....
}

2 个答案:

答案 0 :(得分:6)

是。但正确的方法是在operator+

方面实施operator+=
struct foo
{
    int value;

    foo& operator+=( const foo& other )
    {
        value += foo.value;
        return *this ;
    }

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

为什么?

首先,不应将二进制operator+()定义为成员函数而不是自由函数。这允许您在第一个参数不是foo的情况下实现添加。常见的习惯用法是在类中声明它friend以克服封装。

其次,这种方式提供了一个连贯,可维护和高效的界面

一致性:

如果您实施+=操作,则用户进行操作(除极少数情况外)该类型也提供二进制加法。使用+实现+=可以确保两个操作的行为一致。

可维护性:

您已使用+实施了+=,因此实际执行添加的代码只会写入一次。如果您将来需要更改操作,则必须仅更改一个代码,如果它有错误,则该错误仅在一个站点中。减少代码重复通常是一种很好的做法。

效率:

编写operator+()的方式允许编译器轻松地删除副本,从而提高二进制加法的性能。

使用的习语是“复制第一个操作数,对其进行操作,返回副本”。所以编译器可以轻松执行返回值优化(RVO)。此外,它通过值传递第一个操作数,而不是在函数内手动复制操作数。这允许编译器在第一个操作数是右值时执行更多的复制精简(让编译器决定何时以及如何复制)。

答案 1 :(得分:1)

是的,你可以按照自己的方式去做:

BigNumber& operator +=(const BigNumber& other)
{
    *this=(*this) + other;
    return *this;
}

通常的做法是相反的方式:

// Note a is no const reference
BigNumber operator + (BigNumber a, const BigNumber& b)
{
    return a += b;
}

您的方法的推理可能是内存分配。