Одно из самых больших преимуществ ссылок перед указателями - большая простота и удобочитаемость. Как всегда, когда вы что-то упрощаете, вы упрощаете его использование, но за счет гибкости и контроля вы получаете с помощью низкоуровневых вещей (как уже упоминали другие люди).
Указатели часто критикуют за «уродливость».
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 #, и мне кажется, что работа с необработанными указателями помогла мне лучше понять, что происходит под капотом.
Я не думаю, что всем необходимо начинать с указателей, но важно то, что они понимают, почему используются ссылки вместо типов значений, и лучший способ понять это - взглянуть на его предка, указателя.