代入演算子は次のように宣言できます
T&演算子=(const t&);
クラス内ですが、算術演算子をそのように定義することはできません。それは友達機能でなければなりません。理由がわかりませんか?説明してもらえますか?
代入演算子は次のように宣言できます
T&演算子=(const t&);
クラス内ですが、算術演算子をそのように定義することはできません。それは友達機能でなければなりません。理由がわかりませんか?説明してもらえますか?
算術演算子が友達であることは必須ではありません
次のように定義できます。
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;
}
これは、+ 演算子の左側がクラスではない場合、またはクラスであるが演算子 + をその定義に追加できない場合に行う必要があります。
彼らは理想的にはグローバルであり、必ずしも友達である必要はありません。そうすれば、次のように書くことができます。
yourtype v = 1;
yourtype w = 1 + v;
1はのオブジェクトではないので、メンバーであるyourtype
場合はoperator+
フィットをスローします。ただし、グローバルにすると、1がに変換されてからyourtype
操作が実行されます。友達にすることで、必須でyourtype
はありませんが、必要に応じてのメンバーを抽出して操作することができます。例として:メンバー関数operator+=
を実装し、それをの実装で使用できoperator+
ます。
問題は、次のようなことをした場合です。
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ライブラリを使用するとこのプロセスが非常に簡単になります。