Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Изменить объект, на который указывает ссылка

#cpp #ссылки


У Скотта Мейерса написано:


  Если да, это подрывает основы, потому что C++ не позволяет изменить объект, на
который указывает ссылка.


Вопрос: почему приведенный далее код работает в VS2017?

int main()
{
    int i = 10;
    int& r = i;

    r++;

    int j = 20;
    r = j;

    i = 5;

    int& r2 = r;

    return 0;
}

    


Ответы

Ответ 1



Судя по всему, вы натолкнулись на этот текст тут. Но там речь идет о совсем другом - присваивании двух переменных, которые являются объектами класса, в которых имеется член-ссылка. И вопрос о том, что при этом должно происходить со ссылкой. В контексте имеется в виду не то, что нельзя изменять сам объект через ссылку, а то, что ссылка не может по ходу дела вдруг начать указывать на другой объект. С++ не позволяет никак менять значение самой ссылки, а не объекта, на который он указывает. Ссылка, в отличие от указателя, не может сначала указывать на объект a, а потом вдруг на объект b. Только на один и тот же объект - тот, которым она инициализирована - все время своего существования. Так понятнее? Да, фраза переведена несколько двусмысленно, не спорю...

Ответ 2



Вероятно, Вы не так поняли, что имел ввиду Мейерс. Изменение объектов, на которые указывают ссылки -- вполне возможное действие. Например, когда мы передаем объект в функцию по ссылке. В вашем коде когда вы оперируете с r, вы на самом деле оперируете с объектом, находящимся по адресу, который принадлежит i, и изменяете значение переменной i. Т.о. int & r = i; является "псевдонимом" для переменной i, как когда мы передаем объект в функцию по адресу (по ссылке, например).

Комментариев нет:

Отправить комментарий