Страницы

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

суббота, 30 марта 2019 г.

Переопределение ссылок

В учебнике написано, что любая ссылка должна быть определена в момент объявления, и определена объектом, а не литералом. И её нельзя перевязать на другой объект. Из любопытства сделал следующее:
{ int val = 20,val2 = 2; int &refVal = val; refVal = val2; cout< return EXIT_SUCCESS; }
И к моему удивлению, на выходе ссылка ссылается на переменную val2, в консоли выводит двойку. Как так, это от компилятора зависит? Либо автор не прав. Можно ссылку на официальную документацию? Это вообще нормально?


Ответ

Дело в том, что ссылка это просто синтаксический сахар над указателями, поэтому, если переписать Ваш код через них, должно быть понятно, что происходит:
{ int val = 20,val2 = 2; int*const refVal = &val; *refVal = val2; cout<<*refVal< return EXIT_SUCCESS; }
Заметьте, в коде выше мы лишь единожды инициализируем указатель, а потом уже всюду его разыменовываем, не меняя его, но меняя тот объект, на который он указывает. Так вот, ссылка, будучи инициализирована, не может быть изменена, это просто синтаксически невозможно. Любое последующее использование ссылки является обращением к тому объекту, на который она ссылается(разыменование указателя в моём примеру).

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

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