算術運算子
你可以過載所有基本算術運算子:
- +和- +=
- -和- -=
- *和- *=
- /和- /=
- &和- &=
- |和- |=
- ^和- ^=
- >>和- >>=
- <<和- <<=
所有運算子的過載都是一樣的。向下滾動以獲得解釋
在 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 返回)。第一個引數是按值傳遞的,為什麼?因為
- 你無法修改原始物件(Object foobar = foo + bar;畢竟不應該修改foo,這沒有意義)
- 你不能把它變成 const,因為你必須能夠修改物件(因為operator+是用operator+=實現的,它修改了物件)
傳遞 const& 將是一個選項,但是你必須製作傳遞物件的臨時副本。通過傳遞值,編譯器會為你完成。
operator+= 返回對自身的引用,因為它可以連結它們(不要使用相同的變數,由於序列點,這將是未定義的行為)。
第一個引數是一個引用(我們想要修改它),但不是 const,因為那時你將無法修改它。第二個引數不應該被修改,因此效能原因是由 const& 傳遞的(通過 const 引用傳遞比按值更快)。