Перегрузка оператора, возвращающая ссылку - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь понять, какова реальная проблема с возвратом ссылки, изучая перегрузку операторов. Я создаю эту очень простую проблему:

#include <iostream>
using namespace std;

class mydoub {
    public:
        double pub;
        mydoub(double i = 0) : pub(i) {}
};

mydoub &operator += (mydoub &a, double b) {
    a.pub = a.pub+b;
    return a;
}


int main() {
    mydoub a(5), b(6);
    cout << "1: " << a.pub << "  " << b.pub << endl; // expected output 1: 5 6
    b = a+= 7;
    cout << "2: " << a.pub << "  " << b.pub << endl; // expected output 2: 12 12
    b.pub = 8;
    cout << "3: " << a.pub << "  " << b.pub << endl; // unexpected output: 3: 12  8
}

Вывод:

1: 5  6
2: 12  12
3: 12  8

, что для меня совершенно неожиданно. Фактически, b была присвоена ссылка на a, сразу после того, как последняя была изменена, поэтому я ожидаю, что b.pub=8 будет действовать и на a, в результате передачи ссылки через оператор +=. Почему это не так? Какая тогда разница с нереферентной перегрузкой, скажем mydoub operator += ( ..?

1 Ответ

1 голос
/ 29 марта 2020

Вы балуетесь с пониманием ссылки. Ссылка, по сути, является просто разыменованным указателем, и когда вы делаете b = a, это фактически копирует значение a в b, они не указывают на один и тот же объект. Чтобы указать на тот же объект, вам нужно использовать указатели или сделать b не типом mydoub, а mydoub & type (в этом случае при инициализации вы можете указывать на один и тот же объект).

mydoub & operator + = используется для Можно изменить результат оператора + =. Например,

mydoub a = 1;
++(a += 3)

После этого будет 5, но если вы используете оператор mydoub + =, это будет 4.

...