C++ 算术运算符

示例

您可以重载所有基本的算术运算符:

  • + 和 +=

  • - 和 -=

  • * 和 *=

  • / 和 /=

  • & 和 &=

  • | 和 |=

  • ^ 和 ^=

  • >> 和 >>=

  • << 和 <<=

所有运算符的重载都是相同的。向下滚动以获取说明

class/以外的重载struct:

//应该以operator + =的形式实现operator +
T operator+(T lhs, const T& rhs)
{
    lhs += rhs;
    return lhs;
}

T& operator+=(T& lhs, const T& rhs)
{
    //执行加法
    return lhs;
}

class/中的重载struct:

//应该以operator + =的形式实现operator +
T operator+(const T& rhs)
{
    *this += rhs;
    return *this;
}

T& operator+=(const T& rhs)
{
    //执行加法
    return *this;
}


注意:operator+应该以非const值返回,因为返回引用没有意义(返回对象)也不会返回const值(通常不应该返回by const)。第一个参数是按值传递的,为什么呢?因为

  1. 您不能修改原始对象(毕竟Object foobar = foo + bar;不应该修改foo,这没有任何意义)

  2. 您无法做到这一点const,因为您将必须能够修改该对象(因为operator+是根据operator+=修改了该对象的实现)

通过const&将是一个选项,但是随后您将必须为传递的对象制作一个临时副本。通过传递值,编译器将为您完成此任务。


operator+= 返回对自身的引用,因为这样可以链接它们(尽管不要使用相同的变量,由于序列点,这将是未定义的行为)。

第一个参数是一个引用(我们想对其进行修改),但不是const,因为这样您将无法对其进行修改。第二个参数不应修改,因此出于性能原因而传递const&(通过const引用传递比按值传递更快)。