Одним из самых больших преимуществ ссылок над указателями является большая простота и удобочитаемость. Как всегда, когда вы упрощаете что-то, вы облегчаете использование, но за счет гибкости и контроля вы получаете вещи низкого уровня (как уже упоминали другие люди).
Указателей часто критикуют за «уродливость».
class* myClass = new class();
Теперь каждый раз, когда вы используете его, вы должны сначала разыменовать его либо на
myClass->Method() or (*myClass).Method()
Несмотря на потерю читабельности и усложнение, людям по-прежнему приходилось часто использовать указатели в качестве параметров, чтобы вы могли модифицировать реальный объект (вместо передачи по значению) и повысить производительность, не копируя огромные объекты.
Для меня вот почему ссылки «родились» в первую очередь, чтобы обеспечить то же преимущество, что и указатели, но без всего этого синтаксиса указателей. Теперь вы можете передать фактический объект (а не только его значение) И у вас есть более читабельный, нормальный способ взаимодействия с объектом.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
Ссылки на C ++ отличались от ссылок на C # / Java тем, что как только вы присваивали ему значение, которое было им, вы не можете переназначить его (и оно должно быть назначено, когда оно было объявлено). Это было то же самое, что использование константного указателя (указатель, который нельзя перенаправить на другой объект).
Java и C # - это высокоуровневые современные языки, которые убрали много путаницы, накопившейся в C / C ++ за прошедшие годы, и указатели, безусловно, были одной из тех вещей, которые нужно было «очистить».
Поскольку ваш комментарий о знании указателей делает вас более сильным программистом, в большинстве случаев это так. Если вы знаете, «как» что-то работает, а не просто используете это, не зная, я бы сказал, что это может дать вам преимущество. Какое преимущество всегда будет меняться. В конце концов, использование чего-либо, не зная, как это реализовано, является одной из многих прелестей ООП и интерфейсов.
В этом конкретном примере, что знание о указателях поможет вам со ссылками? Понимание того, что ссылка на C # НЕ является самим объектом, а указывает на объект, является очень важной концепцией.
# 1: Вы НЕ передаете по значению
Для начала, когда вы используете указатель, вы знаете, что указатель содержит только адрес, вот и все. Сама переменная почти пуста, и поэтому так приятно передавать в качестве аргументов. В дополнение к повышению производительности вы работаете с реальным объектом, поэтому любые сделанные вами изменения не являются временными
# 2: Полиморфизм / Интерфейсы
Если у вас есть ссылка, которая является типом интерфейса, и она указывает на объект, вы можете вызывать только методы этого интерфейса, даже если у объекта может быть гораздо больше возможностей. Объекты могут также реализовывать одни и те же методы по-разному.
Если вы хорошо понимаете эти понятия, то я не думаю, что вы слишком много упускаете из-за того, что не использовали указатели. C ++ часто используется как язык для обучения программированию, потому что иногда хорошо пачкать руки. Кроме того, работа с аспектами более низкого уровня заставляет вас ценить комфорт современного языка. Я начал с C ++ и теперь программист на C #, и мне кажется, что работа с необработанными указателями помогла мне лучше понять, что происходит под капотом.
Я не думаю, что всем необходимо начинать с указателей, но важно то, что они понимают, почему ссылки используются вместо типов значений, и лучший способ понять это - посмотреть на своего предка, указатель.