算術運算子
你可以過載所有基本算術運算子:
+
和+=
-
和-=
*
和*=
/
和/=
&
和&=
|
和|=
^
和^=
>>
和>>=
<<
和<<=
所有運算子的過載都是一樣的。向下滾動以獲得解釋
在 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 引用傳遞比按值更快)。