Почему при смене эталонных точек не выдается ошибка? - PullRequest
4 голосов
/ 03 августа 2011

Iv добрался до стадии моего изучения c ++ относительно ссылок.Оно гласит следующее правило:

Как только ссылка инициализируется на объект, она не может быть изменена для ссылки на другой объект.

Iv написал короткий код (как было задано в упражнении)это должно доказать правильность этого правила.

int y = 7;
int z = 8;

int&r = y;
r = z;

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

Ответы [ 5 ]

7 голосов
/ 03 августа 2011

r = z не меняет того, на что указывает r.Он присваивает значение z объекту, на который указывает r.

Следующий код делает то же самое, что и ваш код, но вместо ссылок используются указатели:

int y = 7;
int z = 8;

int* p = &y; // p points to y
*p = z;      // assign value of z to the object pointed to by p (which is y)
4 голосов
/ 03 августа 2011
int&r = y;
r = z;

Это не меняет ссылку. Скорее он изменяет значение , на которое указывает ссылочная переменная. Переменная-ссылка - это просто еще одно имя y. Так что r=z эквивалентно

y = z;

То есть r=z изменяет значение из y.

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

4 голосов
/ 03 августа 2011

Это не делает ссылочный псевдоним для чего-то еще, но это изменяет значение того, что r содержит.

int&r = y;

r относится к y

r = z;

изменяет значение y & r на значение z, присваивая значение z r и, следовательно, y.

3 голосов
/ 03 августа 2011

Вы не меняете ссылку; вы устанавливаете новое значение для указанного объекта. После этого примера вы должны заметить, что y == 8.

1 голос
/ 03 августа 2011

Когда вы делаете r = z, вы не переустанавливаете ссылку, вместо этого вы копируете значение z в y.

...