2012-03-04 52 views
3

是否有一個好處,或者是強制性的讓operator==operator<operator>operator<<operator>>!=>=,......作爲朋友,而不是一個類的方法?運算符==是成員函數還是朋友函數?

我還沒有發現解釋了爲什麼去朋友的方式只有...

我有一個很好用的情況下,如果C1 x; C2 y; C3 z;,我有C3& operator+(C1& , C2&)爲C1和C2的朋友,即當類好文是不同的,但問題是爲什麼對於同一個班級。

+1

你在第三段中的'operator +'似乎沒有道理 - 它是什麼返回一個引用? – 2012-03-04 11:26:20

回答

1

如果您類有關係語義,然後進行類的關係運算符組成部分。另一方面,如果你只需要像<這樣的東西來讓你的類爲某個容器定購,那麼你可能更喜歡爲定義該容器的明確目的而編寫一個單獨的自由函數,而不是暗示它與語義相關聯(或者你可以專門爲你的班級提供std::less)。

對於二元移位運算符<<>>,你可能沒有選擇,因爲當你的類對象是操作的第一參數的成員函數只選擇。除此之外,我會給出相同的建議,只有當操作對於類的語義來說是內在的時,我纔會成爲成員操作符,而不是用於其他無關的目的。

2

獨立函數的參數是這些運算符應該根據操作數類型是對稱的。當您的類具有允許將左操作數隱式轉換爲類類型的構造函數時,將關係運算符實現爲獨立函數而不是方法可能會有好處。否則,你將不得不編寫顯式的構造函數調用或爲其他左操作數類型(組合爆炸)重載操作符。

如果您必須有權訪問班級成員,則只需要朋友聲明。由於一般來說關係運算符不會改變它們的操作數,所以在大多數情況下還有其他的方式來讀取成員。

不要過度使用操作符重載。尤其是,當你的問題中有很多像C1,C2,C3這樣的類型時,它很快就會變得不清楚,特別是對於其他開發人員而言,你的操作員意味着什麼。考慮一個名稱清晰描述你的意圖的函數。

1

朋友功能是優選的,因爲它們允許在情況下使用類似的功能:

bool b = (12345 == myObj); 

這將導致一個編譯錯誤,如果operator==被定義爲成員函數。

相關問題