2011-02-24 152 views
1

在嘗試學習運算符重載時,我從C++ Primer中讀取以下語句。坦率地說,我不太明白這些陳述想傳遞什麼信息。這些示例包括定義成員二元運算符和非成員二元運算符。使用它們有什麼區別嗎?成員二元運算符和運算符重載中的非成員二元運算符

通常我們定義該算術和關係運算符作爲非成員函數和我們定義賦值運算符作爲成員:

Sales_item& Sales_item:: operator (const Sales_item&) 
Sales_item operator_(const Sales_item&, const Sales_item&); 

加法和複合賦值是二進制運算符,但這些功能定義一個不同數量的參數。這個差異的原因是這個指針。

回答

6

是的,實際使用有差異。特別是,當您將運算符超載爲非成員函數時,轉換可以應用於操作數(或兩個操作數)。當您使用成員函數過載二元運算符時,轉換隻能應用於右側的運算對象

這可能會導致一些古怪。例如,可以考慮編寫一個「bignum」包,並且你想重載operator+來處理bignum。如果你重載爲成員函數,你會得到這樣一個怪胎:

int x = 2; 
bignum y = 3; 
bignum z; 

z = y + x; // works fine. 
z = x + y; // doesn't work: x isn't a bignum, and can/won't be converted to one 

相反,如果你使用非成員函數重載operator+,無論是操作就可以了(假設你有一個構造函數從一個int創建一個bignum,你幾乎可以肯定想要)。

幾個運營商(尤其是賦值運算符,如=+=-=等)是特殊的。轉換會創建一個臨時對象,並且不允許將臨時對象分配給1),並且2)無論如何都不合理或完成任務。因此,當您重載賦值運算符時,您始終使用成員函數。