從previous question我想繼續問爲什麼「朋友」的形式除了在C++操作符重載的優先C++操作符覆蓋 - 爲什麼它是朋友的首選?
總結:
的加法運算符覆蓋有兩種方法可以做到這一點:
int operator+(Object& e);
friend int operator+(Object& left, Object& right);
爲什麼第二個(朋友)表單是首選?有什麼優勢?
從previous question我想繼續問爲什麼「朋友」的形式除了在C++操作符重載的優先C++操作符覆蓋 - 爲什麼它是朋友的首選?
總結:
的加法運算符覆蓋有兩種方法可以做到這一點:
int operator+(Object& e);
friend int operator+(Object& left, Object& right);
爲什麼第二個(朋友)表單是首選?有什麼優勢?
首選非成員版本(朋友或其他),因爲它可以支持操作符左側和右側的隱式轉換。
給定一個類型,它是隱式轉換爲對象:
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 &)
與通過轉換w
到Object
生成的參數。所以結果與編寫o + w.operator Object()
相同。
但在表達式w + o
中,編譯器查找Widget::operator+
(不存在)或非成員operator+(Widget, Object)
。如上所述,可以通過將w
轉換爲Object
來調用後者。
我不太瞭解窗口小部件/對象結構代碼,您能否提供一個簡單且極其簡短的示例? –
該規則不是通用的:當您實現採用相同類型的兩個參數的邏輯對稱操作時,首選friend
版本(例如您的帖子演示的情況)。
此實現突出的事實,操作確實是對稱的:它不是一個「對象這」,增加了Object e
本身 - 更確切地說,這是一個加lhs
和rhs
。
在情況下,當操作非對稱的 - 例如,當你添加一個int
一個迭代器,你應該更喜歡實現運營商的第一種方式,即
Object& operator+(int& offset);
可能更好地引用相關位從最後一個問題開始,所以人們不必點擊它(也可以在問題消失的情況下) – nneonneo