Аргументы функций, передаваемые в C ++ против Java - PullRequest
0 голосов
/ 05 октября 2019

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

Передача по значению в C ++:

void modify(int x, int y){
  x=10;
  y=20;
}
void main(){
  int a=5,b=8;
  cout << a; //outputs 5
  cout << b; //outputs 8
  modify(a,b);
  cout << a; //still outputs 5
  cout << b; //still outputs 8
}

modify (a, б); -> параметры называются фактические параметры (параметры, передаваемые в функцию) и из void modify (int x, int y) -> параметрыназываются формальные параметры (параметры, полученные функцией).

Все 4 параметра: a, b и x, y имеют разные области памяти. Когда строка modify (a, b); достигнута, формальные параметры (x и y) будут иметь копию значений фактических параметров (a и b). Другими словами, x будетбудет 5 и у будет 8, но при достижении этих строк:

x = 10;y = 20;

значения формальных параметров будут изменены на 10 и 20 соответственно. После этого функция модификации будет удалена из стека, возвращаясь к основному методу, где фактические параметры (a и b) будут по-прежнему иметь те же значения: a = 5 и b = 8.

Это передача / вызов по значению, и она также применима к Java.

СЕЙЧАС, в отношении передача / вызов по ссылке (только в C ++):

void modify(int* p) {
    *p = 10;
}
void main()
{
    int a = 5;
    int* p = &a;
    modify(p);
    cout << a << endl; //a is now 10.
}

Из того, что я понял до сих пор, это вызов по ссылке , и это можно сделать с помощью указателей. Достигнув линии , измените (p) ;мы передали в качестве аргумента адрес «a», который хранится в «p», поэтому в этом случае, имея ссылку в качестве аргумента в функции void modify (int * p) , мы получили доступ«a» в этой ячейке памяти и, достигнув этой строки: * p = 10; (разыменование), мы устанавливаем значение «a» равным 10.

Мой вопрос: Почему Java не считается передачей также по ссылке , потому что я вижу, что она действует так же, как и в случае с C ++? Я видел приведенный ниже код для другого вопроса, касающегося Java, и я также опубликую ответ этого человека, который смутил меня больше.

public static void main(String[] args){
            Dog myDog = new Dog("Rover"); //myDog is a reference, a pointer to the object in memory
            foo(myDog); //you're passing the address of the object
    }

//Suppose the Dog object resides at memory address 42. This means we pass 42 to the method.

    public void foo(Dog someDog) {
    someDog.setName("Max");     // AAA
    someDog = new Dog("Fifi");  // BBB
    someDog.setName("Rowlf");   // CCC
    }

    /*Let's look at what's happening.
        the parameter someDog is set to the value 42
        at line "AAA"
            someDog is followed to the Dog it points to (the Dog object at address 42)
            that Dog (the one at address 42) is asked to change his name to Max
        at line "BBB"
            a new Dog is created. Let's say he's at address 74
            we assign the parameter someDog to 74
        at line "CCC"
            someDog is followed to the Dog it points to (the Dog object at address 74)
            that Dog (the one at address 74) is asked to change his name to Rowlf
            then, we return

Did myDog change?
        There's the key.
        Keeping in mind that myDog is a pointer, and not an actual Dog, the answer is NO. myDog still has the value 42; it's still pointing to the original Dog (but note that because of line "AAA", its name is now "Max" - still the same Dog; myDog's value has not changed.)
     If Java had pass-by-reference semantics, the foo method we defined above would have changed where myDog was pointing when it assigned someDog on line BBB.*/

Из того, что я заметил, как в случае с C ++где мы изменили значение «a» с 5 на 10 , здесь на Java, установив имя собаки с Rover на Max, не так ли вызов по ссылке ?

Посмотрев на это утверждение:

/*If Java had pass-by-reference semantics, the foo method we defined above would have changed where myDog was pointing when it assigned someDog on line BBB.*/

Я применил это также в C ++ на основе предыдущегопример:

void modify(int* p) {
    *p = 10;
    int b = 20;
    p = &b;
}
void main()
{
    int a = 5;
    int* p = &a;
    cout << p << endl; //OUTPUTS memory address 2002(e.g. let's say)
    modify(p);
    cout << a << endl; //a is now 10.
    cout << p << endl; // ALSO OUTPUTS the same memory address 2002
}

, но "p" не указывает на адрес "b" при выходе из функции modify .

Это моя путаница, потому что на основе строки Если бы в Java была семантика передачи по ссылке, то определенный выше метод foo изменился бы там, куда указывал myDog, когда он назначил someDog в строке BBB. и применяя то же самое в C ++, это приводит к тому, что ни JAVA, ни C ++ не имеют передачи по ссылке , но только передачи по значению . Если вы можете сказать мне, почему у Java нет передачи по ссылке , когда она действует как в C ++, как я вижу (пример с DOG), я был бы благодарен!

...