2012-10-07 33 views
5

previous question我想繼續問爲什麼「朋友」的形式除了在C++操作符重載的優先C++操作符覆蓋 - 爲什麼它是朋友的首選?

總結:

的加法運算符覆蓋有兩種方法可以做到這一點:

int operator+(Object& e); 
friend int operator+(Object& left, Object& right); 

爲什麼第二個(朋友)表單是首選?有什麼優勢?

+1

可能更好地引用相關位從最後一個問題開始,所以人們不必點擊它(也可以在問題消失的情況下) – nneonneo

回答

5

首選非成員版本(朋友或其他),因爲它可以支持操作符左側和右側的隱式轉換。

給定一個類型,它是隱式轉換爲對象:

struct Widget 
{ 
    operator Object() const; 
}; 

僅如果Widget實例的左側出現的非成員版本可以稱爲:

Widget w; 
Object o; 

o + w; // can call Object::operator+(Object &) since left-hand side is Object 
w + o; // can only call operator+(Object &, Object &) 

在回答您的評論:

通過定義轉換運算在Widget中,我們通知編譯器Widget的實例可以自動轉換爲Object的實例。

Widget w; 
Object o = w; // conversion 

在表達式o + w,編譯器調用Object::operator+(Object &)與通過轉換wObject生成的參數。所以結果與編寫o + w.operator Object()相同。

但在表達式w + o中,編譯器查找Widget::operator+(不存在)或非成員operator+(Widget, Object)。如上所述,可以通過將w轉換爲Object來調用後者。

+0

我不太瞭解窗口小部件/對象結構代碼,您能否提供一個簡單且極其簡短的示例? –

2

該規則不是通用的:當您實現採用相同類型的兩個參數的邏輯對稱操作時,首選friend版本(例如您的帖子演示的情況)。

此實現突出的事實,操作確實是對稱的:它不是一個「對象這」,增加了Object e本身 - 更確切地說,這是一個加lhsrhs

在情況下,當操作非對稱的 - 例如,當你添加一個int一個迭代器,你應該更喜歡實現運營商的第一種方式,即

Object& operator+(int& offset);