Есть два вопроса в одном, кажется:
- один вопрос о синтаксисе: разница между указателем и ссылкой
- другой вопрос о механике и реализации:представление памяти ссылки
Давайте обратимся к двум по отдельности.
Синтаксис ссылок и указателей
Указатель, концептуально,«знак» (как дорожный знак) к объекту.Он допускает 2 вида действий:
- действия над указателем (или указанным объектом)
- действия над самим указателем
* operator*
и operator->
позволяют вам получить доступ к pointee, чтобы отличить его от вашего доступа к самому указателю.
Ссылка - это не "знак", это псевдоним.На протяжении своей жизни, будь то ад или высокая вода, он будет указывать на один и тот же объект, с которым вы ничего не можете поделать.Поэтому, поскольку вы не можете получить доступ к самой ссылке, нет смысла беспокоить вас странным синтаксисом *
или ->
.По иронии судьбы, не использование странного синтаксиса называется синтаксическим сахаром.
Механика ссылки
Стандарт C ++ ничего не говорит о реализации ссылок, он просто намекает на то, что еслиможет компилятор может удалить их.Например, в следующем случае:
int main() {
int a = 0;
int& b = a;
b = 1;
return b;
}
Хороший компилятор поймет, что b
- это просто прокси для a
, нет места для сомнений, и, таким образом, просто получит прямой доступ к a
и оптимизируетb
out.
Как вы уже догадались, вероятным представлением ссылки является (под капотом) указатель, но не позволяйте ему беспокоить, это не влияет на синтаксис или семантику.Это, однако, означает, что ряд проблем с указателями (например, доступ к удаленным объектам) также влияет на ссылки.