5

クラスがオーバーロードする場合operator+、オブジェクトに対して割り当てを行わないため、constとして宣言する必要がありますか?また、私はそれを知ってoperator=おりoperator+=、割り当てが行われているので参照を返します。しかし、どうoperator+ですか?それを実装するとき、現在のオブジェクトのコピーを作成し、それに指定されたオブジェクトを追加して、その値を返す必要がありますか?

これが私が持っているものです:

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+ですか?または、問題や望ましくない/未定義の動作を引き起こす可能性のある見落としているものがありますか?

4

1 に答える 1

6

それよりも、それを無料の関数にする必要があります。

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

しかし、はい、それをメンバー関数として残す場合はconst、左側のオブジェクトを変更しないため、そのままにしておく必要があります。

参照とコピーのどちらを返すかに関して、演算子のオーバーロードに関するアドバイスは、基本型と同じように実行することです(つまり、intsと同じように実行します)。この場合、2つの整数を加算すると、どちらの入力も参照しない別個の整数が返されます。

于 2012-11-16T05:13:13.923 に答える