Информация об изменениях

Сообщение Re[5]: Не могу понять ссылки в C++ от 15.06.2024 15:58

Изменено 15.06.2024 15:59 rg45

Re[5]: Не могу понять ссылки в C++
Здравствуйте, Worminator X, Вы писали:

WX>Так, то есть указатели нужны там, где связанный объект может меняться (при обходе по циклу, например)? А ссылки всегда иммутабельные после первого присваивания?


Все правильно, ссылка связывается с каким-либо объектом и остается к нему привязанной все свое время жизни. В определенных случаях ссылки даже могут продлевать время жизни временных объектов, к которым они привязаны. И С++ запрещает создание непривязанных ссылок. Все, без исключения, операции со ссылкой имеют строго такой же эффект, как если бы все эти операции выполнялись непосредственно над объектом, к которому эта ссылка привязана. Основная практическая польза от использования ссылок состоит в том, что программист избавлен от необходимости проверять ссылку на null, как в случае с указателями, ибо требования стандарта языка таковы, что в корректной программе не может появиться ссылки, привязанной к нулевому адресу. Единственная проблема, которая лежит на плечах программиста — держать под контролем время жизни ссылок и объектов, на которые эти ссылки ссылаются. Нет никакого криминала в том, что время жизни объекта закончится раньше, чем время жизни ссылки. Но программист должен исключть возможность использования таких "висячих" (dangling) ссылок. Достигается это обычно путем продумывания дизайна.

В отличие от ссылки, указатель — это объект (переменная), хранящая адрес другого объекта. Подобно обычной целочисленной переменной, значение адреса, записанное в указателе может изменяться и сбрасываться в null. Одно из полезных применений указателя мы уже упомянули — это использование его в качестве итератора по последовательностям, занимающим непрерывные области памяти. Другое частое применение логически можно обозначить как "необязательная ссылка". Т.е. ссылка на необязательный объект, который может отсутсвовать. Перед использованием указателя для доступа к адресуемым данным, необходимо проверить его на null.
Re[5]: Не могу понять ссылки в C++
Здравствуйте, Worminator X, Вы писали:

WX>Так, то есть указатели нужны там, где связанный объект может меняться (при обходе по циклу, например)? А ссылки всегда иммутабельные после первого присваивания?


Все правильно, ссылка связывается с каким-либо объектом и остается к нему привязанной все свое время жизни. В определенных случаях ссылки даже могут продлевать время жизни временных объектов, к которым они привязаны. И С++ запрещает создание непривязанных ссылок. Все, без исключения, операции со ссылкой имеют строго такой же эффект, как если бы все эти операции выполнялись непосредственно над объектом, к которому эта ссылка привязана. Основная практическая польза от использования ссылок состоит в том, что программист избавлен от необходимости проверять ссылку на null, как в случае с указателями, ибо требования стандарта языка таковы, что в корректной программе не может появиться ссылки, привязанной к нулевому адресу. Единственная проблема, которая лежит на плечах программиста — держать под контролем время жизни ссылок и объектов, на которые эти ссылки ссылаются. Нет никакого криминала в том, что время жизни объекта закончится раньше, чем время жизни ссылки. Но программист должен исключть возможность использования таких "висячих" (dangling) ссылок после окончания времени жизни объекта. Достигается это обычно путем продумывания дизайна.

В отличие от ссылки, указатель — это объект (переменная), хранящая адрес другого объекта. Подобно обычной целочисленной переменной, значение адреса, записанное в указателе может изменяться и сбрасываться в null. Одно из полезных применений указателя мы уже упомянули — это использование его в качестве итератора по последовательностям, занимающим непрерывные области памяти. Другое частое применение логически можно обозначить как "необязательная ссылка". Т.е. ссылка на необязательный объект, который может отсутсвовать. Перед использованием указателя для доступа к адресуемым данным, необходимо проверить его на null.