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