Перегрузка составного оператора присваивания в C ++ не меняет переменную - PullRequest
0 голосов
/ 22 октября 2019

Чтобы лучше познакомиться с C ++, я реализую класс для управления комплексными числами.

class Complex {
    private:
        double _real;
        double _imag;

    public:
        Complex();
        Complex(double real, double imag);
        Complex(const Complex& z);

        Complex operator+(const Complex& u) const;
        Complex operator+=(const Complex& u);
};

Я уже перегружен оператор +, который работает, как и ожидалось:

Complex Complex::operator+(const Complex& u) const {
    Complex z(_real + u._real, _imag + u._imag);
    return z;
}

u=1-2i
v=2-1i
u+v=3-3i

Кроме того, я хотел также перегрузить +=:

Complex Complex::operator+=(const Complex& u) {
    Complex z(_real + u._real, _imag + u._imag);
    return z;
}

Это, однако, не работает должным образом, и результат u+=v равен u=1-2i. Почему это так?

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Ваш составной оператор присваивания создает новый объект z вместо изменения исходного объекта.

Объявите оператор в определении класса, например

Complex & operator+=(const Complex& u);

, и определите его следующим образом

Complex & Complex::operator+=(const Complex& u) {
    _real += u._real;
    _imag += u._imag;

    return *this;
}

Оператор может быть определен как функция, не относящаяся к классу. ,Например

class Complex {
    private:
        double _real;
        double _imag;

    public:
        Complex();
        Complex(double real, double imag);
        Complex(const Complex& z);

        Complex operator+(const Complex& u) const;
        friend Complex & operator+=(Complex &v, const Complex& u);
};
Complex & operator+=(Complex &v, const Complex& u)
{
    v._real += u._real;
    v._imag += u._imag;

    return v;
}
1 голос
/ 22 октября 2019

Во-первых, операторы присваивания должны возвращать ссылку на присвоенное значение.

Во-вторых, ваш код должен изменять значение текущего объекта.

Есть несколько решений:

Complex& Complex::operator+=(const Complex& u) {
    *this = Complex(_real + u._real, _imag + u._imag);
    return *this;
}

или

Complex& Complex::operator+=(const Complex& u) {
    _real += u._real;
    _imag += u._imag;

    return *this;
}
...