2017-05-15 7 views
0

オペレータのオーバーロードがプラス記号であることを理解しようとしています。演算子のオーバーロードがプラス記号であるC++

Box operator+(const Box& b) { ... } 
Box operator+(const Box& left, const Box& right) { ... } 

どちらが正しいのですか?2つのプロトタイプがあります。違いが最初のものだけがメンバ関数で、2番目がメンバでない場合、私は両方の方法を定義し、次にどちらを呼び出すのかを教えてください。

Box a, b; 
Box c = a + b; 
+0

お試しください。 (塗りつぶし、塗りつぶし) –

+0

_ "私は両方の方法を定義すると言うことができます" _あなたはそれを試したとき何が起こったのですか? –

+0

@RustyX:どのように表示されません。 –

答えて

1

「正しい」または「より良い」とは、アプリケーションによって異なります。メンバーバージョンではBoxのすべてのプライベート属性とメソッドにアクセスできますが、メンバー以外のバージョンではfriendBoxと宣言されていない限り、メンバーバージョンにはアクセスできません。しかし、非会員はテンプレート化され、幅広い種類に適用されることができます。

メンバーは一般的にメンバー以外のメンバーよりもコンパイラーには好まれず、その逆もありません。代わりに、C++ overload resolution rulesがどちらかを選択するために適用されます。 Box&メンバ関数(*this)、及びconst Box& bを呼び出すために使用されるオブジェクトを指す: Box Box::operator+(const Box& b)

は、2つの引数を取るものとして扱われます。

この例では、abの両方が非constです。

Box Box::operator+(const Box& b)を呼び出すには、bをconst参照に変換する必要があります。

Box operator+(const Box& left, const Box& right)を呼び出すには、abの両方をconst参照に変換する必要があります。

メンバーの演算子が選択されているのは、一致がより良い(コンバージョンが少ない)ためです。

メンバーoperator+constと宣言されていた場合、呼び出しが不明瞭になるためコンパイラエラーが発生します。

+0

他の重要な相違点の1つ:非メンバーは、左手オペランドを暗黙的に「ボックス」に変換することを可能にする。メンバーはしません。 – aschepler

関連する問題