演算子はのメンバー関数に似ていますclass rectangle
が、別の呼び出し形式を使用します。
int len = r1.operator+(r3);
他のユーザーが提案した関数として呼び出すこともできます。
したがって、クラスの演算子を使用して操作を作成すると、コンパイラーはその呼び出しを指定された演算子の一部と一致させようとします。あなたの電話で:
int len = r1+r3;
コンパイラーは、operator+
に入れることができるものを返し、パラメーターとしてaint
を受け取るものを探し、関数を見つけました。次に、パラメータを使用してこの関数を呼び出し、結果を返します。rectangle
int operator+(rectangle r1)
r3
int
int operator+(rectangle r1)
関数に指定されたパラメーターはsoのコピーであるr3
ため、またはで動作しているのではr3
なく、動作しているのはそのためです。r1
r2
これは質問では言及されていませんが、言及する価値があると思います:
演算子が通常従うモデルには適してoperator+
いないようです。を追加して操作とはrectangle
異なるオブジェクトを取得する場合rectangle
、演算子のようには見えません。何を手に入れたいのか、sの総和とは何かを考えなければならないと思いますrectangle
。
二項演算子として、通常は同じ種類のオブジェクトを取得して返します(操作チェーンで使用するため)。オブジェクト自体は変更されないため、constである必要があります。
class rectangle
{
// Reference in order to avoid copy and const because we aren't going to modify it.
// Returns a rectangle, so it can be used on operations chain.
rectangle operator+(const rectangle &r) const
{
rectangle Result;
// Do wathever you think that must be the addition of two rectangles and...
return Result;
}
};
int main()
{
rectangle r1(10,20);
rectangle r2(40,60);
rectangle r3 = r1 + r2;
// Operation chain
rectangle r4 = r1 + r2 + r3;
rectangle r5 = r1 + r2 + r3 + r4;
// Is this what you're looking for?
int width = (r1 + r3).width();
int height = (r1 + r3).height();
}
単項演算子の場合、パラメーターと戻り値も同じタイプである必要がありますが、戻り値は操作の一部となるオブジェクトである必要があります。
class rectangle
{
// Reference in order to avoid copy and const because we aren't going to modify it.
// Returns a rectangle, so it can be used on operations chain.
rectangle &operator+=(const rectangle &r) const
{
// Do wathever you think that must be the addition of two rectangles and...
return *this;
}
};
int main()
{
rectangle r1(10,20);
rectangle r2(40,60);
rectangle r3 = r1 + r2;
// Weird operation chain, but it's only an example.
rectangle r4 = (r1 += r2) += r3;
rectangle r5 = (r1 += r2) += (r3 += r4);
}