「正しい」または「より良い」とは、アプリケーションによって異なります。メンバーバージョンではBox
のすべてのプライベート属性とメソッドにアクセスできますが、メンバー以外のバージョンではfriend
がBox
と宣言されていない限り、メンバーバージョンにはアクセスできません。しかし、非会員はテンプレート化され、幅広い種類に適用されることができます。
メンバーは一般的にメンバー以外のメンバーよりもコンパイラーには好まれず、その逆もありません。代わりに、C++ overload resolution rulesがどちらかを選択するために適用されます。 Box&
メンバ関数(*this
)、及びconst Box& b
を呼び出すために使用されるオブジェクトを指す: Box Box::operator+(const Box& b)
は、2つの引数を取るものとして扱われます。
この例では、a
とb
の両方が非constです。
Box Box::operator+(const Box& b)
を呼び出すには、b
をconst参照に変換する必要があります。
Box operator+(const Box& left, const Box& right)
を呼び出すには、a
とb
の両方をconst参照に変換する必要があります。
メンバーの演算子が選択されているのは、一致がより良い(コンバージョンが少ない)ためです。
メンバーoperator+
がconst
と宣言されていた場合、呼び出しが不明瞭になるためコンパイラエラーが発生します。
お試しください。 (塗りつぶし、塗りつぶし) –
_ "私は両方の方法を定義すると言うことができます" _あなたはそれを試したとき何が起こったのですか? –
@RustyX:どのように表示されません。 –