運算子的過載一般我們會使用以下兩種形式
成員函式
非成員函式
其實這兩種定義不僅在語法上,在語義上也是有差別的。語法上,定義為成員函式,比如 operator+=,只接受乙個引數,而非成員函式接受2個引數語義上,這涉及到臨時物件無法繫結到左值引用的問題,比如我們過載operator +=, operator ++
struct foo
foo& operator ++()
#endif
};#ifdef non_member_operator
foo& operator +=(foo& lhs, const foo& rhs)
foo& operator ++(foo& lhs)
#endif
這裡,如果是使用成員函式的形式,那麼我們就可以在臨時物件上呼叫operator+=,或者operator++
foo() += foo();
++foo();
該語句將可以通過編譯。但通常情況下我們不希望修改臨時物件,因為修改通常會隨著臨時物件的銷毀而丟失。使用非成員函式的情況,上述語句將無法編譯,因為臨時物件無法繫結到左值引用,這通常是符合我們要求的,並且更容易防止誤用的情況。所以從這點上,對於mutating的運算子過載,我們更傾向於使用非成員函式的形式。
ThinkingInC 61 非成員運算子
當操作者的左側是不同的類時。運算子過載不可能是正確的類中。iostreamoperatoroverloading.cpp 書本 thinkinginc 功能 非成員運算子 當運算子的左側是不同的類的時候,就不能吧運算子過載到類裡面了。include require.h include include...
C 非成員函式實現運算子 過載
非成員函式實現運算子過載可以實現運算子前後都可以隱式轉換成所需的型別進行計算,如 fraction d a 2 根據a的型別,將2隱式轉換為fraction型別 fraction e 2 a 當類具有獲取參與運算子過載運算的必要私有資料介面時,使用非友元非成員函式。include using nam...
C 成員運算子
點 運算子和 箭頭 運算子用於引用類 結構和共用體的成員。點運算子應用於實際的物件。箭頭運算子與乙個指向物件的指標一起使用。例如,假設有下面的結構 struct employee emp 下面的 把值 zara 賦給物件 emp 的first name成員 strcpy emp first name...