Синтаксическая логика ++ по отношению к ссылкам и как возвращаемое значение - PullRequest
1 голос
/ 18 марта 2019
int f3(int i, int j) {
    int& k = i;
    ++j;
    return ++k;
}
int main()
{
    int i = 2, j = 4, k;
    k = f3(i, j);
    cout << "i: " << i << " j: " << j << " k: " << k << endl;
    return 0;
}

почему я получаю i = 2 и k = 3.Я имею в виду, конечно, потому что я установил int& k = i, и i, и k, по сути, являются одной и той же переменной, поскольку они совместно используют одно и то же пространство памяти.Кто-нибудь может объяснить, почему это так на простом английском?Или что я не понимаю?

Ответы [ 4 ]

2 голосов
/ 18 марта 2019

Здесь вы устанавливаете i на 2:

int i=2,

И здесь вы передаете i:

k=f3(i,j);

Однако вы передаете копия из i:

int f3(int i, int j) // you need a "&" in here too if you want to pass the reference

Итак, в этой строке:

int& k = i;

Вы устанавливаете k как ссылку на копию из i.Таким образом, когда вы изменяете его, фактическое i из main не изменяется.

Вместо этого попробуйте это:

int f3(int &i, int j) { // now you're pssing a reference to i, not a copy thereof

И ваше выходное значение для i будет3.Хороший пример вызова по ссылке см. здесь .

1 голос
/ 18 марта 2019

Вы правы, что i и k по сути являются одной и той же переменной.Однако в этой строке int f3(int i, int j) вы передали переменную i по значению, а не по ссылке.Это означает, что какие бы изменения вы ни сделали в i в своей функции, они не будут сохранены в int main().

int f3(int i, int j) {
   int& k = i; // k = 2 and it's a reference to the local variable i
   ++j; 
   return ++k; // k = 3, local variable i = 3
} 

int main() { 
   int i = 2, j = 4, k;
   k = f3(i, j); // k = 3, i and j are unchanged because they were passed by value
   cout << "i: " << i << " j: " << j << " k: " << k << endl;
   return 0;
}

Что вы сделали здесь int& k = i;, вы создали ссылку k на локальную переменную i, которая является просто копией переменной i из вашего int main().По сути, k не наносит вреда i с int main().

1 голос
/ 18 марта 2019

Вы передаете аргументы по значению .

Переменная k ссылается только на локальную переменную i внутри функции f3.

1 голос
/ 18 марта 2019

int f3(int i, int j)

Параметр i передается как значение. Таким образом, переменная i, объявленная в main, и параметр i в функции - это разные переменные. Вам нужно передать i как ссылку, чтобы сделать ее ссылкой, если i объявлено в main.

int f3(int &i, int j)

...