Класс C ++ возвращает ссылку с новым адресом - PullRequest
0 голосов
/ 09 октября 2018

В течение последних 24 часов я просматривал книгу «Сэм научи себя С ++ за 24 часа», и следующий код вводит меня в заблуждение.Перегруженный оператор ++ возвращает ссылку на объект Const Counter.Таким образом, я ожидаю, что объект Counter с именем «a» будет иметь тот же адрес, что и объект Counter с именем «c», который был возвращен «a» с помощью оператора ++ (после увеличения члена).Но после запуска этого простого кода вы можете видеть, что адреса «а» и «с» разные.Почему это так, поскольку «а» является ссылкой на «с» и, следовательно, должен иметь один и тот же адрес?

#include <iostream>

class Counter
{
public:
    Counter();
    ~Counter(){}
    int getValue() const { return value; }
    void setValue(int x) { value = x; }
    void increment() { ++value; }
    const Counter& operator++();

private:
    int value;
};

Counter::Counter():
value(0)
{}

const Counter& Counter::operator++()
{
    ++value;
    return *this;
}

int main()
{
    Counter c;
    std::cout << "The value of c is " << c.getValue() 
        << "\n";
    c.increment();
    std::cout << "The value of c is " << c.getValue() 
        << "\n";
    ++c;
    std::cout << "The value of c is " << c.getValue() 
        << "\n";
    Counter a = ++c;
    std::cout << "The value of a: " << a.getValue();
    std::cout << " and c: " << c.getValue() << "\n";

    std::cout << "address of a: " << &a << "\n" << "address of 
c: " << &c << "\n";

    return 0;
}

1 Ответ

0 голосов
/ 09 октября 2018

Таким образом, я ожидаю, что объект Counter с именем "a" будет иметь тот же адрес, что и объект Counter с именем "c", который был возвращен "a" с помощью оператора ++.

Это было бы верно, если вы захватываете возвращаемое значение по ссылке, например

Counter const& a = ++c;

Когда вы используете

Counter a = ++c;

Новый объект создается из возвращаемого значения ++c.Следовательно, c и a имеют два разных адреса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...