2012-04-09 232 views
6

可能重複:
Operator overloadingC++運算符重載==

什麼是通過以下方式重載運營商之間的差異==?

// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 

// as taught in other places, including caltech 
bool MyClass::operator== (MyClass &rhs); 

哪種方式更好?

+3

您可以在[運算符重載常見問題解答](http://stackoverflow.com/questions/4421706/operator-overloading)中找到此問題的答案:) – 2012-04-09 07:05:36

+0

FAQ說:「二進制中綴比較運算符根據經驗法則,應該將其作爲非成員函數來實現「,但它不能證明爲什麼存在此規則 - http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719 – danio 2014-02-05 11:10:30

回答

1

此:

friend bool operator== (MyClass &lhs, MyClass &rhs); 

是一個函數,其比較兩個對象。

此:

bool MyClass::operator== (MyClass &rhs); 

是一個成員函數。

你應該使用你的編碼標準提出的那個,或者使用你喜歡的。沒有更好的了。有些人(包括我自己)喜歡將比較運算符作爲函數,其他人則更喜歡將其作爲成員函數。

順便說一下,參數應該是const MyClass &類型。

2

首先是外部的好友功能(無功能)

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) 

(因爲你的類不能知道,可能需要比較運營商所有關於班)

+0

-1 :對不起,但是我的答案中解釋了一般首選變體。 – 2012-04-09 07:28:21

3
// 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&),但是該點仍然存在 - 非成員函數可以幫助確保該操作員在任一側使用用戶定義類型)。

另外,隱式的構造函數有點危險 - 你想要考慮使用它們的便利性與危險性。