2015-05-02 37 views
1

這個問題的會員和非會員提供了一個很好的答案,爲什麼定義運算符重載非成員:Operator overloading : member function vs. non-member function?運算符重載:當只有相同類型的對象可以參與

如果你定義操作重載函數作爲成員函數, 然後編譯器將諸如s1 + s2的表達式翻譯爲 s1.operator +(s2)。這意味着,操作符重載的成員函數 會在第一個操作數上被調用。這就是成員函數的工作方式!

但是如果第一個操作數不是類呢?如果我們想要在第一個操作數不是 類類型的情況下重載運算符,那麼存在一個主要問題 ,而是說雙重。所以你不能像這樣寫10.0 + s2。但是,您可以編寫運算符重載成員函數 表達式,如s1 + 10.0。

現在我有一種情況,我需要重載operator==。就我而言,只有(a)與(b)類型相同的類型的對象進行比較。

是否有理由將operator==定義爲非成員,還是應該將其作爲成員實現?

+1

據你所知,只有相同類型的物體將被比較*今天*。你不知道未來。良好的風格是很好的風格。 –

回答

1

因爲operator==對於它的LHS和RHS參數具有對稱語義,推薦的方法是始終將其作爲其操作數的公共接口的非成員實現(或者如果需要私有數據,則將其聲明爲班上的朋友)。

所以

class Bla 
{ 
public: 
    // complete interface to data required for comparison 
    auto first(); 
    auto second(); 
    // ... more 
private: 
    // data goes here 
}; 

bool operator==(Bla const& L, Bla const& R) 
{ 
    return 
     std::forward_as_tuple(L.first(), L.second() /*, ... */) == 
     std::forward_as_tuple(R.first(), R.second() /*, ... */) 
    ; 
} 

這樣,隱式轉換Bla被認爲是L和R兩個參數(我不是說隱式轉換是一個好主意,但如果你有這些,這是更好地避免只考慮RHS論點的意外)。