我讀過一個聲明爲成員函數的重載運算符是不對稱的,因爲它只能有一個參數,而另一個自動傳遞的參數是'this'指針。所以沒有標準來比較它們。另一方面,被聲明爲朋友的重載運算符是對稱的,因爲我們傳遞了兩個相同類型的參數,因此可以進行比較。 我的問題是,當我仍然可以比較一個指針的左值與引用時,爲什麼朋友更喜歡? (使用非對稱版本會得到與對稱版本相同的結果) 爲什麼STL算法只使用對稱版本?運算符重載:成員函數與非成員函數?
81
A
回答
101
如果您將運算符重載函數定義爲成員函數,那麼編譯器會將表達式s1 + s2
轉換爲s1.operator+(s2)
。 這意味着,運算符重載的成員函數會在第一個操作數上被調用。這就是成員函數的工作方式!
但是如果第一個操作數不是類呢? 如果我們想要在第一個操作數不是類的類型時重載操作符,那麼存在一個主要問題,而不是類型double
。所以你不能這樣寫10.0 + s2
。但是,您可以編寫運算符重載成員函數,用於表達式如s1 + 10.0
。
爲了解決這個訂購問題,我們定義操作重載功能friend
如果需要訪問private
成員。 只有當它需要訪問私人成員時才使它成爲friend
。否則乾脆就讓它非朋友非會員功能改進封裝!
class Sample
{
public:
Sample operator + (const Sample& op2); //works with s1 + s2
Sample operator + (double op2); //works with s1 + 10.0
//Make it `friend` only when it needs to access private members.
//Otherwise simply make it **non-friend non-member** function.
friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
}
閱讀這些:
A slight problem of ordering in operands
How Non-Member Functions Improve Encapsulation
14
這不一定friend
運算符重載和成員函數運算符重載,因爲它是全球運算符重載和成員函數運算符重載之間的區別。
一個理由,更喜歡一個全球運算符重載是,如果你想允許式,其類類型的二元運算符的右右手邊出現。例如:
Foo f = 100;
int x = 10;
cout << x + f;
這隻能如果存在用於
富操作者+(INT X,常量富& F)一個全球運營商超載;
請注意,全局運算符過載不一定需要是friend
函數。這僅在需要訪問Foo
的私人成員時纔有必要,但情況並非總是如此。
無論如何,如果Foo
只有一個成員函數運算符重載,如:
class Foo
{
...
Foo operator + (int x);
...
};
...那麼我們只能夠在那裏一個Foo
實例上似乎有表情離開的加運營商。
相關問題
- 1. 作爲成員函數和非成員函數的運算符函數
- 2. 運算符使用非成員函數重載?
- 3. 成員與非成員運算符重載
- 4. 作爲非成員函數重載'>'
- 5. 非虛重載成員函數
- 6. 重載成員函數
- 7. 用於重載成員函數的成員函數指針
- 8. C++成員vs非成員運算符+
- 9. 重載一個布爾運算符的成員函數
- 10. 運算符重載(朋友和成員函數)
- 11. 作爲成員函數重載*乘法運算符兩次?
- 12. 重載運算符()對成員函數get()方法
- 13. 標量類型和運算符重載的成員函數
- 14. 成員函數vs操作符重載
- 15. 抽象的基類與數據成員,構造函數和運算符重載
- 16. 將加法運算符重載爲非成員函數會更好嗎?
- 17. 從const成員函數調用非const成員函數
- 18. 調用從const成員函數非const成員函數指針
- 19. C++從非成員函數
- 20. 成員函數非對象
- 21. 非成員函數模板
- 22. 非靜態成員函數
- 23. 作爲成員或非成員函數的算法?
- 24. 插入運算符的非成員函數形式
- 25. 運算符==是成員函數還是朋友函數?
- 26. 成員函數指針,傳遞函數作爲非成員函數的參數
- 27. 將非會員非朋友函數加入到成員函數
- 28. 與非成員函數鏈接錯誤
- 29. 靜態非模板成員函數與靜態模板成員函數
- 30. ==操作符重載考慮非靜態成員函數
你的問題實在是隻有約二元運算符。並非所有重載操作符都被限制爲單個參數。 ()運算符可以接受任意數量的參數。另一方面,一元運算符不能有任何參數。 – 2011-01-07 04:16:23
http://stackoverflow.com/a/4421729/103167 – 2012-02-19 01:09:23
這是[C++ FAQ:運算符重載]中涵蓋的許多主題之一(http://stackoverflow.com/questions/4421706/operator-overloading) – 2012-02-19 01:09:37