непонимание ссылок на C ++ - PullRequest
3 голосов
/ 05 декабря 2011

Что я знал о ссылках на c ++, так это:

  1. Ссылка должна быть инициализирована в объявлении объявления
  2. Ссылка не может быть переопределена после определения

Следующий фрагмент кода отлично работает на g++ 4.6.1, хотя он ломает # 2:

int a = 10, b = 30;
int& x = a;
x = b;

Ответы [ 6 ]

7 голосов
/ 05 декабря 2011

Вы не переопределяете ссылку, а скорее присваиваете значение указанной ячейке памяти. Сделайте printf из a, и вы увидите, что он напечатает 30 вместо 10; -)

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

Уловка джедая:

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

Думайте о ссылках как о псевдониме.

Это довольно ясно:

int a = 10, b = 30;

Думайте об этом не как x = 10, а как "x - это другое название для".

int& x = a;

Итак, x будет по-прежнему ссылаться на a, поэтому вы даете значение b (30).

x = b;

В этот момент x все еще привязан к a, вы только что изменили его значение.

Итак, x == 30 и a == 30 на данный момент, но если вы сделаете:

a = 10;

x также будет равно 10.

3 голосов
/ 05 декабря 2011

Ссылка не может быть переустановлена ​​, т. Е. Вызвана ссылка на другую переменную.

Совершенно возможно изменить переменную через ссылку.

БазовыйЭффект ссылки заключается в том, что она становится другим именем для значения, на которое она ссылается.

2 голосов
/ 05 декабря 2011

код из вопроса не ломается 2

в точке, в которой вы пишете:

int& x = a;

x становится псевдонимом для a .

Позже вы пишете:

x = b;

Это присваивает значение b a через его псевдоним с именем x .

1 голос
/ 05 декабря 2011

Это константная переменная , которая должна быть инициализирована в операторе объявления и не может быть переопределена.

0 голосов
/ 05 декабря 2011

Третье утверждение не делает то, что вы думаете, что оно делает. Он присваивает значение b x и, следовательно, a.

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