Перегрузка операторов класса - PullRequest
1 голос
/ 21 мая 2011

Это очень простой вопрос о перегрузке оператора. Скажем, у меня был такой класс ...

class xy
{
    public:
    double x, y;
    XY(double X, double Y) { x = X; y = Y;}
    XY operator+(const XY & add) const {
        return XY(this->x + add.x, this->y + add.y);
    }
    XY & operator+=(const XY & add) const {?}
    }
}

И я хочу, чтобы оператор + = делал то, что должен делать (вы знаете, добавьте к текущему значению x и y). Разве код не будет одинаковым для оператора + и оператора + =?

Ответы [ 3 ]

5 голосов
/ 21 мая 2011

Как могло быть так же?Они делают разные вещи.

Если вам не нужны оптимизации, вы можете использовать += в реализации + оператора:

XY operator + (const XY& right) const
{
    XY left(*this);
    left += right;
    return left;
}
3 голосов
/ 21 мая 2011

Нет.Обычно operator+ сохраняет результат в новом объекте и возвращает его по значению, тогда как operator+= добавляет правую часть к *this и возвращает *this по ссылке.

Два операторасвязанные - и часто могут быть реализованы в терминах друг друга - но они имеют различную семантику и поэтому не могут иметь идентичные реализации.

3 голосов
/ 21 мая 2011

Да, выполните операцию добавления (придерживайтесь оператора +=) и верните ссылку на себя.О, и это не может быть const метод.

XY & operator+=(const XY & add) {
   this->x += add.x;
   this->y += add.y;
   return *this;
}
...