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

В «языке программирования C ++» есть пример

void g()
{  
   int ii = 0;
   int& rr = ii;
   rr++;
   int* pp = &rr;
}

Автор заявляет:

Это допустимо, но rr ++ не увеличивает ссылочный rr,скорее ++ применяется к int, который оказывается ii.

Я довольно запутан в этом утверждении, почему «rr ++ не увеличивает ссылочный rr»?Таким образом, rr просто используется как «мост» для приращения ii?

Ответы [ 4 ]

3 голосов
/ 07 октября 2011

Да, в C ++ ссылка - это не что иное, как псевдоним или "мост", как вы говорите. Каждый раз, когда вы говорите rr, это , как если бы вы сказали бы ii, «оригинальное» имя переменной, на которую rr ссылается.

Это отличается от ссылок во многих других языках (которые ведут себя больше как указатели C ++). В C ++ ссылки не являются объектами, они не имеют отдельной идентичности. Вы не можете указать ссылку «пожалуйста, увеличьте», «укажите нулевое значение» или что-либо еще. Это просто становится другим именем для переменной, на которую указывает ссылка.

1 голос
/ 07 октября 2011

Ссылка похожа на разыменованный указатель на переменную. Например:

int v = 3;
int* pv = &v;
int& rv = v;

// Access v through a pointer:
*pv = 4;

// Access v through a reference:
rv = 4;

В этом примере оба оператора установят v на 4.

0 голосов
/ 07 октября 2011

Увеличивает ii, не увеличивает адрес, содержащийся в rr.

0 голосов
/ 07 октября 2011

То есть rr просто используется как «мост» для увеличения ii?

Точно. Внутренне он будет хранить адрес ii, а компилятор будет увеличивать int по этому адресу. Может быть использован, например ::

int left, right;
...
int &direction = random_bool() ? left : right;
++direction; // would change left or right, depending on random_bool()

, но в основном используется в параметрах функций и типах возвращаемых данных.

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