Я знаю, что ссылки - это синтаксический сахар, поэтому код легче читать и писать.
Но каковы различия?
Резюме из ответов и ссылок ниже:
- Указатель может быть повторно назначен любым количеством раз, в то время как ссылка не может быть повторно назначена после привязки.
- Указатели не могут указывать нигде (
NULL
), тогда как ссылка всегда относится к объекту. - Вы не можете использовать адрес ссылки, как вы можете, указателями.
- Там нет "ссылочной арифметики" (но вы можете взять адрес объекта, на который указывает ссылка, и выполнить арифметику указателя на нем, как в
&obj + 5
).
Чтобы прояснить заблуждение:
Стандарт C++ очень осторожен, чтобы не диктовать, как компилятор может реализовать ссылки, но каждый C++ компилятор реализует ссылки в качестве указателей. То есть, декларация, такая как:
int &ri = i;
если он полностью не оптимизирован, выделяет тот же объем памяти, что и указатель, и помещает адрес
i
в это хранилище.
Таким образом, указатель и ссылка используют одинаковый объем памяти.
Как общее правило,
- Используйте ссылки в функциональных параметрах и типах возврата для предоставления полезных и самодокументирующих интерфейсов.
- Используйте указатели для реализации алгоритмов и структур данных.
Интересное чтение:
- Мой любимый любимый C++ FAQ lite.
- Ссылки против указателей.
- Введение в ссылки.
- Ссылки и сост.