Java — Call-By-Value против Call-By-Reference вновь

позвольте мне сначала сказать. Я знаю, что название подозревает, что я задаю вопрос, на который много раз отвечали здесь и в Интернете. Я действительно исследовал, но я не могу найти удовлетворительный ответ.

Мой вопрос в конце концов сводится к этому. Почему Java Call By Value и C ++ Call By Reference (при использовании указателей)?

Рассмотрим вызов метода в Java при передаче ссылок и в c ++ при передаче указателей. В конце концов, в обоих случаях я могу внести изменения, которые видны звонящему. Также в обоих случаях я передаю адрес объекта в функцию. На самом деле, я копирую, то есть выполняю вызов по значению также в c ++ при передаче указателя, не так ли?

Вы можете просто проверить это обстоятельство, запустив следующий код:

#include <iostream>

void modify (int *i) {
int a = 5;
i = &a;
}

int main () {
int b;
int *i = &b;
std::cout << i << std::endl;
modify(i);
std::cout << i << std::endl;
return 0;
}

Который будет печатать два раза один и тот же адрес.

Для меня просто недостаточно оправдать вызов ссылкой со свойством, что вы можете сделать с ним функцию подкачки. Я хотел бы знать самую суть того, что делает звонок по ссылке звонком по ссылке.

Заранее спасибо.

0

Решение

Мой вопрос в конце концов сводится к этому. Почему Java Call By Value и C ++ Call By Reference (при использовании указателей)?

C ++ действительно является вызовом по значению, а не вызовом по ссылке. Поведение по ссылкам, которое вы видите в C ++, является побочным эффектом того факта, что вы передаете указатель: сам указатель копируется по значению. Вы не можете сравнить эти ситуации, потому что у Java нет указателей.

1

Другие решения

В качестве примера вы приводите нецелевое использование звонка по ссылке. В функции modify

void modify (int *i) {
int a = 5;
i = &a;
}

Вы объявляете локальную переменную a который находится в стеке. Когда он выходит из области видимости, его адрес не имеет смысла. Так присваивая адрес a в i ни на что не влияет i указывает на.

Так что вызов по ссылке работает, вы можете изменить значение того, что i указывает на в функции. Например:

void modify (int *i) {
int a = 5;
*i = a;
}

Поэтому в основной функции вы можете вызвать ее так:

int b = 2;
int *i = &b;
std::cout << *i << std::endl;  //This will print 2
modify(i);
std::cout << *i << std::endl;  //This will prints 5
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector