算术运算符

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

  • ++=
  • --=
  • **=
  • //=
  • &&=
  • ||=
  • ^^=
  • >>>>=
  • <<<<=

所有运算符的重载都是一样的。向下滚动以获得解释

class / struct 之外超载:

//operator+ should be implemented in terms of operator+=
T operator+(T lhs, const T& rhs)
{
    lhs += rhs;
    return lhs;
}

T& operator+=(T& lhs, const T& rhs)
{
    //Perform addition
    return lhs;
}

class / struct 内部超载:

//operator+ should be implemented in terms of operator+=
T operator+(const T& rhs)
{
    *this += rhs;
    return *this;
}

T& operator+=(const T& rhs)
{
    //Perform addition
    return *this;
}

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

  1. 你无法修改原始对象(Object foobar = foo + bar; 毕竟不应该修改 foo,这没有意义)
  2. 你不能把它变成 const,因为你必须能够修改对象(因为 operator+是用 operator+= 实现的,它修改了对象)

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

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

第一个参数是一个引用(我们想要修改它),但不是 const,因为那时你将无法修改它。第二个参数不应该被修改,因此性能原因是由 const& 传递的(通过 const 引用传递比按值更快)。