Разъяснение ссылок в C ++ - PullRequest
       12

Разъяснение ссылок в C ++

6 голосов
/ 26 декабря 2011

Итак, я пытаюсь выучить C ++, и я натолкнулся на то, что меня немного озадачило.У меня есть код,

int x = 0;
int &y = x;
cout << &x<< " " << x << " " << &y << " " <<y<< endl;

Это прекрасно компилируется и приводит к:

0 003AFA08 0 003AFA08

Что мне трудно понять, почему преобразование x, int, & & y, ссылки,не приводит к ошибке.Сначала я подумал, что это какое-то преобразование, однако

int &y = &x;

приводит к ошибке.

Может кто-нибудь объяснить, почему это работает таким образом?Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 26 декабря 2011

int& не является адресом . Это ссылка .

int& y = x; объявляет y как ссылку на x. Это фактически означает, что y становится другим именем для x. Каждый раз, когда вы используете y, это как если бы вы сказали x.

Указатели (не ссылки) используются для хранения адресов. int& y = &x; недопустим, потому что &x - это адрес x (это int*). y является ссылкой на int, а не ссылкой на int*.

5 голосов
/ 26 декабря 2011

Это не конверсия.Когда у вас есть тип переменной T &, где T - некоторый случайный тип, вы в основном говорите: «Я объявляю имя, которое является псевдонимом для другого имени или, возможно, анонимным значением».Это больше похоже на typedef, чем на указатель.

Ссылки часто бывают реализованы в виде адресов, но это не очень хорошая модель для того, чтобы думать о том, чем они являются.что вы озадачены:

int * const &y = &x;

будет работать просто отлично.Тогда y становится псевдонимом для временного результата взятия адреса x.Обратите внимание, что это ссылка на указатель.Это должна быть ссылка на постоянный указатель, потому что это ссылка на временное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...