2

私は最近、非メンバー演算子のオーバーロードについて言及している演算子のオーバーロードに関する記事を調べていました。非メンバー演算子のオーバーロードの意味を誰かが例を挙げて説明していただければ幸いです。メンバー演算子のオーバーロードが何であるかを知っています(演算子タイプ(バイナリなど)をオーバーロードするクラスのメソッド。非メンバー演算子のオーバーロードの目的は演算子のオーバーロードを処理することであると私に信じさせるSOに関するこの投稿に出くわしましたここで、最初のパラメーターはクラスではなく、単にネイティブ型です。非メンバー演算子のオーバーロードが何であるかを説明するリンクまたは例は、間違いなくありがたいです。

4

2 に答える 2

4

これは、クラス外でオーバーロードできることを意味します。

struct X { int data; };

bool operator<(X const& a, X const& b) 
{
       return a.data < b.data;
}

これは、左側のオペランドが独自の型である必要がない非対称オーバーロードに役立ちます。

bool operator<(int a, X const& b) 
{
       return a < b.data;
}

ここでの一般的なイディオムは、クラス内の定義およびフレンド宣言と組み合わせることです。

struct X 
{ 
    int data; 
    friend bool operator<(X const& a, X const& b) { return a.data<b.data; }
    friend bool operator<(int a, X const& b) { return a<b.data; }
};

ここでoperator<は、まだ技術的に会員です。

以下のDrewDormannによって指摘されているように、これのもう1つの有用な副作用は、正確な型の式だけでなく、(X const&, X const&)暗黙的にに変換可能なすべてのオペランドにが適用されることです。X const&

于 2013-03-17T21:55:48.443 に答える
0

最も一般的な方法は、で呼び出される演算子<<をオーバーロードすることstd::coutです:

namespace X { 
      class MyClass { 
       ...
       };  
}
std::ostream& operator<< (std::ostream&, const X::MyClass&);

これはstd::ostreamメンバーで呼び出されるため、クラス内で定義する必要はありません。ただし、パブリックインターフェイスを介して機能を実現できない場合があります(オペレーターがデータ表現にアクセスする必要があるため)。

于 2013-03-17T22:05:00.530 に答える