Ссылка в разнице в лх и рч в С ++ - PullRequest
2 голосов
/ 06 октября 2009

Я изучаю C ++ и обнаружил, что когда ссылка находится справа, может быть два случая. Предположим, у меня есть метод:

int& GetMe(int& i) { return i; }

А у меня есть:

(1) int j; GetMe(j) = GetMe(i);

и

(2) int& k = GetMe(i);

Последствия (1) и (2) различны. В (1) семантика заключается в копировании значения i в j. Адреса i и j остались прежними. Изменение i никак не влияет на j. На самом деле это тот случай, когда вы перегружаете оператор индекса [] и используете оператор индекса для присваивания. В (2) семантика заключается в создании референта из i как k. k имеет тот же адрес, что и i, и изменение i влияет на k.

Так почему у нас есть различия? Я думаю, что в C ++ адрес ссылки определяется один раз и только один раз. Как только адрес ссылки определен, он никогда не будет изменен позже В (1) ссылка на j определяется ранее, поэтому действие заключается в копировании значения из i в j. В (2) ссылка k объявляется и инициализируется, поэтому это делается с использованием ссылки i. Таким образом, действие является инициализацией ссылки.

Я не нашел материала, явно говорящего выше, поэтому я хочу подтверждения. Любой, кто хорошо знает ссылки на C ++, должен помочь мне или указать, как очистить материал. Большое спасибо в продвинутом.

Ответы [ 3 ]

5 голосов
/ 06 октября 2009

Что вам здесь не хватает, так это того, что тип переменной отличается, и это все, что имеет значение. В первом примере у вас есть int j, а во втором - int &k.

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

На самом деле, ваш код точно соответствует

int j;
int & j1 = j;
int & i1 = i;
j1 = i1;

против

int & i1 = i;
int & k = i1;

Легко видеть, что в первом случае две ссылки фактически ссылаются на разные переменные, т.е. на разные части в памяти, но во втором случае все они ссылаются на одну и ту же переменную. Отсюда и разница.

3 голосов
/ 06 октября 2009

В случае 1, GetMe возвращает ссылку на j, а затем вы присваиваете значение j через эту ссылку. В случае 2 GetMe возвращает ссылку на i, а затем вы присваиваете эту ссылку другой ссылке k, означающей, что k ссылается на i.

Ссылки являются неизменными в C ++ (это означает, что вы не можете изменить то, на что ссылается ссылка, хотя вы можете изменить значение референта). Ссылки также прозрачно заменяют то, на что они ссылаются, когда используются в правой части выражения. Неизменность ссылок означает, что в 1 нет двусмысленности - вы должны намереваться присвоить то, на что ссылается возвращаемое значение GetMe, а не изменять ссылку. В 2 нет двусмысленности, потому что вы назначаете ссылку на ссылку (вы не можете назначить int для ссылки на int).

0 голосов
/ 06 октября 2009

Разница в том, что во втором примере вы определяете ссылку, а в первом примере вы присваиваете существующую ссылку.

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