什麼是通過以下方式重載運營商之間的差異==?
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
和
// as taught in other places, including caltech
bool MyClass::operator== (MyClass &rhs);
哪種方式更好?
什麼是通過以下方式重載運營商之間的差異==?
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
和
// as taught in other places, including caltech
bool MyClass::operator== (MyClass &rhs);
哪種方式更好?
此:
friend bool operator== (MyClass &lhs, MyClass &rhs);
是一個函數,其比較兩個對象。
此:
bool MyClass::operator== (MyClass &rhs);
是一個成員函數。
你應該使用你的編碼標準提出的那個,或者使用你喜歡的。沒有更好的了。有些人(包括我自己)喜歡將比較運算符作爲函數,其他人則更喜歡將其作爲成員函數。
順便說一下,參數應該是const MyClass &
類型。
首先是外部的好友功能(無功能)
friend bool operator== (MyClass &lhs, MyClass &rhs);
二是成員函數
bool MyClass::operator== (MyClass &rhs);
您應該使用第二個變體總是那麼你可以
你應該先用變體案例: 1)第一個參數是外部(庫)類
friend ostream& operator<< (ostream &out, MyClass &m)
2)運營商的邏輯不相關的類,必須單獨實施
friend bool operator(const MyClass& my, const std::string& string_form)
(因爲你的類不能知道,可能需要比較運營商所有關於班)
-1 :對不起,但是我的答案中解釋了一般首選變體。 – 2012-04-09 07:28:21
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
參數應爲const
- friend bool operator==(const MyClass& lhs, const MyClass& rhs);
。這是首選,因爲它可以隱式構建第一個參數。例如,如果std::string
只有成員函數operator==
,那麼"abc" == my_std_string
將不會調用它!但是,非成員函數可以通過隱式地從「abc」構造一個字符串來調用(更好的是,在這種特殊情況下,可以出於性能原因提供單獨的bool operator==(const char*, const std::string&)
,但是該點仍然存在 - 非成員函數可以幫助確保該操作員在任一側使用用戶定義類型)。
另外,隱式的構造函數有點危險 - 你想要考慮使用它們的便利性與危險性。
您可以在[運算符重載常見問題解答](http://stackoverflow.com/questions/4421706/operator-overloading)中找到此問題的答案:) – 2012-04-09 07:05:36
FAQ說:「二進制中綴比較運算符根據經驗法則,應該將其作爲非成員函數來實現「,但它不能證明爲什麼存在此規則 - http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719 – danio 2014-02-05 11:10:30