22

重複の可能性:
演算子のオーバーロード

operator== をオーバーロードする次の方法の違いは何ですか?

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

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

どちらの方法が良いですか?

4

3 に答える 3

11
// 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&)パフォーマンス上の理由から別の関数を提供できますが、要点は変わりません - 非メンバー関数は、演算子は、どちらの側でもユーザー定義型で機能します)。

それとは別に、暗黙のコンストラクターは少し危険です。それらを使用することの利便性と危険性についてよく考えてください。

同様に、あなたが を持っていてObjectOfAnotherClassType == ObjectOfMyClassTypeAnotherClassのようなキャスティング オペレータを使用しているoperator MyClass() const場合、非メンバー/友人operator==はキャストが開始され、比較を行うことができるようになります。メンバーoperator==フォームはそうではありません。

最後のポイント:比較する必要があるデータにアクセスする方法が他にない場合にのみ、非メンバーoperator==を aにする必要があります。それ以外の場合は、オプションで、最終的に同じ実行可能ファイルにリンクされた複数の翻訳単位から含まれる可能性のあるヘッダーに実装が必要な場合friendは、クラスの外部で宣言/定義できます。inlineただし、それほど害はありません。それを作成することfriendが、定義をクラステンプレート内に配置する唯一の方法であり、「template <typename ...>」のものとパラメーターを繰り返す必要はありません....

于 2012-04-09T07:27:34.457 に答える
7

まずは外部フレンド機能(無料機能)

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

2番目はメンバー関数です

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

常に2番目のバリアントを使用する必要があります。

次の場合に最初のバリアントを使用する必要があります。1) 最初の引数が外部 (ライブラリ) クラスである

friend ostream& operator<< (ostream &out, MyClass &m)

2) オペレーターのロジックはクラスに関係なく、個別に実装する必要があります

friend bool operator(const MyClass& my, const std::string& string_form)

(あなたのクラスは、比較演算子で必要になる可能性のあるクラスについてすべてを知ることができないため)

于 2012-04-09T07:16:29.137 に答える
5

これ :

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

2 つのオブジェクトを比較する関数です。

これ :

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

メンバー関数です。

コーディング標準で提案されているものを使用するか、好みのものを使用してください。どれも良くありません。一部の人々 (私を含む) は、比較演算子を関数として使用することを好みますが、メンバー関数として使用することを好む人もいます。

ちなみに、パラメータはconst MyClass &型でなければなりません。

于 2012-04-09T07:05:26.000 に答える