算術運算子

你可以過載所有基本算術運算子:

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

所有運算子的過載都是一樣的。向下滾動以獲得解釋

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 引用傳遞比按值更快)。