0

C ++の私のクラスでは、クラスを作成し、プラス演算子をオーバーライドしました。

これはプロトタイプです:

Var operator + (const Var& var);

IDE がこれが正しいと教えてくれる理由:

Var a = 3;
a + 5;  //  Correct

しかし、これではありませんか?

Var a  = 3;
5 + a;  //  error

この順序でオブジェクトと整数を合計するにはどうすればよいですか?

4

4 に答える 4

2

その理由は、メンバー関数としての演算子が対称的でないためです。演算子を定義するクラスのオブジェクトは、常に左側にある必要があります。

必要なのは、演算子関数をクラスの外に置くことです。

Var operator+(const Var&, const Var&);

また、プライベート フィールドにアクセスする必要がある場合は、それをフレンド関数として宣言します。

于 2013-06-21T14:36:11.647 に答える
1

後者の場合、無料の関数が必要です

Var operator + (int, const Var& var);

他の形式は、Var に暗黙的な変換があることを示唆しているため、

Var operator + (const Var& lhs, const Var& rhs);

さらに良いかもしれません。

メンバー関数は、lhs での変換を許可しないことに注意してください。

于 2013-06-21T14:36:20.127 に答える
1

この順序でオブジェクトと整数を合計するにはどうすればよいですか?

非メンバーである必要があります。

Var operator + (const Var& var1, const Var & var2);

これにより、右側のオペランドだけでなく、どちらのオペランドにも型変換を適用できます。

クラスのプライベートにアクセスする必要がある場合は、フレンドである必要もあります。

于 2013-06-21T14:36:11.900 に答える
0

演算子をメンバー関数としてオーバーロードすると、演算子は対称ではなくなります。その理由は、オーバーロードされた操作が最初の引数で呼び出されるためです。したがって、+演算子をメンバー関数としてオーバーロードして記述した場合、a1+a2それは に変換されa1.operator+(a2)ます。これは、a1 がクラスのメンバーでなければならないことを意味します。

対称的な機能が必要な場合は、クラスの外部で実装し、クラスのプライベート データ メンバーにアクセスする必要がある場合は、friend.

Var operator+(const Var& first, const Var& second);

于 2013-06-21T14:48:56.007 に答える