2012-11-16 4 views
5

クラスがoperator+をオーバーロードするとき、オブジェクトに代入を行わないのでconst宣言する必要がありますか? また、operator=operator+=は割り当てが行われているため参照を返します。しかし、operator+はどうですか?実装する際には、現在のオブジェクトのコピーを作成し、そのオブジェクトをそのオブジェクトに追加してその値を返す必要があります。C++ - `operator +` constを作るべきですか?それは参照を返しますか?

class Point 
{ 
public: 
    int x, int y; 

    Point& operator += (const Point& other) { 
     X += other.x; 
     Y += other.y; 
     return *this; 
    } 

    // The above seems pretty straightforward to me, but what about this?: 
    Point operator + (const Point& other) const { // Should this be const? 
     Point copy; 
     copy.x = x + other.x; 
     copy.y = y + other.y; 
     return copy; 
    } 
}; 

これはoperator+の正しい実装です:ここで

は私が持っているものでしょうか?あるいは、私が見落としている何かが、トラブルや望ましくない/未定義の動作を引き起こす可能性がありますか?

+1

演算子のオーバーロードの多くの詳細は、ここで見つけることができます:http://stackoverflow.com/questions/4421706/operator-overloading – chris

答えて

6

よりも良い、あなたはそれフリー機能させる必要があります。

Point operator+(Point lhs, const Point& rhs) { // lhs is a copy 
    lhs += rhs; 
    return lhs; 
} 

しかし、それは左側のオブジェクトを変更しないようはい、あなたはメンバ関数としてそれを残せば、それはconstする必要があります。

参照またはコピーを返すかどうかについては、オペレータのオーバーロードに関するアドバイスはで、基本タイプはとなります(つまり、intとして実行します)。この場合、2つの整数の加算は、どちらの入力も参照しない別の整数を返します。

+0

ああ、わかります。ありがとうございました。また、無料の機能として持つことのメリットは何ですか? –

+1

@BrandonMiller:型の対称性。型に暗黙の変換コンストラクタがある場合(つまり、他の型から暗黙的に変換できる場合)、自由関数実装では両方の引数に対して変換が許可されますが、メンバ関数は右辺でのみ変換できます。 –

+0

良い情報があります!私はそれを考えなかった。 –

関連する問題