如何在操作员中调用操作员 =

how to call operator + in operator +=

本文关键字:操作员 调用      更新时间:2023-10-16

以这种方式定义操作员 =是正确的吗?

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

在这样的课程中:

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

是。但是正确的方法是用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以骑封装。

第二,这种方式提供了一个连贯,可维护和有效的接口

连贯性:

如果您实现了+=操作,则用户SPECT(在极少数情况下)类型也提供了二进制添加。用+=实施+提供了这一点,以确保两个操作的行为连贯。

可维护性:

您已经使用+=实现了+,因此真正执行添加的代码仅在>>中写成。如果您将来需要更改操作,则必须仅更改一个代码,并且如果它的错误仅在一个站点中。简化代码重复是一个很好的做法。

效率:

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

使用的成语为"复制第一操作数,在其上进行操作,返回副本" 。因此,编译器可以轻松执行返回值优化(RVO)。此外,它通过值传递了第一个操作数,而不是在功能中通过手动复制操作数。这允许编译器在第一个操作数为rvalue (让编译器决定何时以及如何复制)时执行更多复制精神。

是的,您可以按照自己的方式进行操作:

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

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