Когда указатель, когда ссылка
Вопрос
Расскажите, чем указатель отличается от ссылки и как вы выбираете между ними в параметрах функций.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Ссылка: псевдоним, обязана быть инициализирована, не перепривязывается, не бывает нулевой
Указатель: отдельный объект с адресом, может быть nullptr и меняться
`const T&` для чтения больших объектов, `T&` для изменения
Указатель или `std::optional` когда значения может не быть
Для владения не сырой указатель, а `std::unique_ptr` или значение
Что могут спросить следом
- Может ли ссылка «висеть»?
- Зачем нужны указатели на указатели, если есть ссылки на указатели?
- Как передать «необязательный» параметр без указателя?
Разбор
Ссылка это другое имя существующего объекта: её нужно инициализировать сразу, перепривязать нельзя, и по правилам языка она всегда связана с объектом. Указатель это самостоятельная переменная, хранящая адрес: его можно менять, обнулять, хранить в контейнерах. В параметрах я беру const T&, когда функция только читает большой объект, T&, когда она обязана изменить аргумент, и передачу по значению для дешёвых типов или когда функция всё равно делает копию. Указатель выбираю, когда объекта может не быть, например необязательный выходной параметр или узлы структур данных, хотя для «может не быть» по значению есть std::optional. Важно: ни сырой указатель, ни ссылка не говорят о владении. Если функция забирает владение, это std::unique_ptr по значению. И ссылка тоже может висеть, если объект умер раньше неё: например, ссылка на элемент вектора после реаллокации.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.