1

代入演算子は次のように宣言できます

T&演算子=(const t&);

クラス内ですが、算術演算子をそのように定義することはできません。それは友達機能でなければなりません。理由がわかりませんか?説明してもらえますか?

4

4 に答える 4

4

算術演算子が友達であることは必須ではありません

次のように定義できます。

MyClass MyClass::operator + (const MyClass& t) const
{
  MyClass ret(*this);
  ret += t;
  return ret;
}

a + b実際には構文糖衣であり、コンパイラはそれを に展開しa.operator+(b)ます。前のサンプルは、すべてのオブジェクトが MyClass インスタンスである場合は機能しますが、他のタイプで操作する必要がある場合は機能しません。つまり1 + a、機能しません。これは、フレンドを使用して解決できます。

MyClass operator + (int i, const MyClass& t)
{
  MyClass ret(i);
  ret += t;
  return ret;
}

これは、+ 演算子の左側がクラスではない場合、またはクラスであるが演算子 + をその定義に追加できない場合に行う必要があります。

于 2009-03-13T12:17:42.500 に答える
2

彼らは理想的にはグローバルであり、必ずしも友達である必要はありません。そうすれば、次のように書くことができます。

yourtype v = 1;
yourtype w = 1 + v;

1はのオブジェクトではないので、メンバーであるyourtype場合はoperator+フィットをスローします。ただし、グローバルにすると、1がに変換されてからyourtype操作が実行されます。友達にすることで、必須でyourtypeはありませんが、必要に応じてのメンバーを抽出して操作することができます。例として:メンバー関数operator+=を実装し、それをの実装で使用できoperator+ます。

于 2009-03-13T11:19:47.693 に答える
0

問題は、次のようなことをした場合です。

class A
{
    A& operator+(int n);
    // ...
}

int main()
{
    A my_var;
    int integer = 1;
    A + integer; // compiles
    integer + A // error: no function operator+(int, A) defined
}

コンパイルされません。解決策は、operator +(int、A)とoperator +(A、int)をAのフレンドとして定義することです。補足として、BoostOperatorsライブラリを使用するとこのプロセスが非常に簡単になります。

于 2009-03-13T16:16:58.897 に答える