Odporúčaná, 2024

Redakcia Choice

Rozdiel medzi volaním podľa hodnoty a volaním podľa referencie

V C ++ a Java existujú dva spôsoby, ako zavolať funkciu alebo metódu. Prvá je "volanie podľa hodnoty" a druhá je "volanie podľa referencie". Metóda volania podľa hodnoty prenesie iba hodnotu premennej na funkčný kód a ak nastane zmena hodnoty premennej v rámci tejto funkcie, nemá vplyv na pôvodnú hodnotu tejto premennej. Vo výzve referenčnou metódou prechádzame samotnou premennou do argumentu a zmena hodnoty premennej ovplyvňuje aj pôvodnú hodnotu tejto premennej. Hlavným rozdielom medzi týmito metódami je, že metódou volania podľa hodnoty prechádza hodnota premennej a volanie prostredníctvom referencie prechádza adresou premennej.

Porovnávacia tabuľka:

Základ pre porovnanieCall_By_ValueCall By Reference
základné
Kópia premennej je úspešná.Samotná premenná je úspešná.
účinokZmena v kópii premennej nezmení pôvodnú hodnotu premennej na strane funkcie.Zmena v premennej ovplyvňuje aj hodnotu premennej mimo funkcie.
Volanie parametrovnázov_funkcie (meno_zmeny1, meno_zmennej_2, ...; ...);názov_funkcie (& variable_name1, & variable_name2, ...;);
// v prípade objektu
object.func_name (objekt);
Príjem parametrovtype function_name (typ variable_name1, type variable_name2, ... ...)
{., }
zadajte typ_funkcie (typ * premenná_menu1, typ * premenná_zmenu2, ... ....) {., }
// v prípade objektu
zadajte názov_funkcie (typ_typu názov_objektu)
{., }
Predvolené volanieprimitívny typ sa odovzdáva pomocou "volania podľa hodnoty".objekty sú implicitne odovzdávané pomocou "volania podľa referencie".

Definícia hodnoty po výzve

Ak zadáte prvotný typ údajov (celé číslo, znak a reťazec) na funkciu / metódu, prenesie sa na funkčný kód len "hodnota". Funkcia kopíruje hodnotu argumentu na "formálny parameter" funkčného kódu. Ak v funkčnom kóde dochádza k nejakej modifikácii formálneho parametra, nezmení sa pôvodná hodnota argumentu, ktorý sa používa na vyvolanie tejto funkcie.

Jednoducho povedané, ak sa funkcia / metóda nazýva prístupom "volanie podľa hodnoty"; potom sa kópia premennej odovzdá funkčnému kódu. Ak funkčný kód vykoná akékoľvek zmeny hodnoty v kópii premennej, nemení pôvodnú hodnotu premennej.

Pozrime sa na príklad, aby sme to stručne porozumeli.

 // príklad v triede Java check {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("hodnota parametra vo funkcii"); system.out.println ("hodnota 'i', ktorá akceptuje hodnotu argumentu 'a'" + i); system.out.println ("hodnota 'j', ktorá akceptuje hodnotu argumentu 'b'" + j); }} trieda call_by _value {verejná statická void main (reťazec args []) {int a = 12, b = 20; skontrolujte C = nová kontrola (); system.out.println ("hodnota" a "a" b "pred volaním funkcie" + a + "" + b); C.change (a, b); // volanie podľa hodnoty. system.out.println ("hodnota" a "a" b "po volaní funkcie" + a + "" + b); }} // výstupná hodnota 'a' a 'b' pred volaním funkcie 12 20 hodnota parametra vo vnútri hodnoty funkcie 'i', ktorá akceptuje hodnotu argumentu 'a' 144 hodnota 'j', ktorá akceptuje hodnotu argument "b" 10 hodnota "a" a "b" po volaní funkcie 12 20 

Definícia volania podľa odkazu

Referenčná metóda volania prostredníctvom odkazu prenesie referenciu / adresu argumentu do kódu funkcie. Keď sa adresa argumentu odovzdá funkčnému kódu, formálny parameter prijímania tejto adresy bude premenná ukazovateľa. Teraz, keď funkčný kód získal adresu argumentu, zmena hodnoty argumentu tiež zmení pôvodnú hodnotu argumentu.

V C ++ a Java je veľmi bežné, že objekt prechádza na funkciu / metódu a objekt je vždy odovzdaný jeho referenciou. Zmeny vykonané s objektom vo vnútri funkcie / metódy ovplyvňujú objekt, ktorý sa používa na vyvolanie tejto funkcie / metódy.

Nasledujúci fragment ukazuje správny spôsob "volania odkazom".

 // príklad v swapovej triede C ++ {void swap (int * x, int * y) {int temp; teplota = * x; * X = * y; * Y = teplota; }} int hlavná {int a = 10, b = 20; cout << "hodnota a, b pred volaním funkcie" << << "" << 

Teraz poďme diskutovať o "výzve odkazom" tým, že odovzdáme "objekt" ako argument, ktorý implicitne vyhovuje prístupu "výzva odkazom".

 kontrola triedy {int a, b; skontrolujte (int x, int b) {// objekt inicializovaný cez tento konštruktor a = x; b = y; } prázdna výmena (skontrolovať ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (reťazec args []) {check C = nová kontrola (20, 40); // inicializácia objektu. system.out.println ("hodnota ob.a" a "ob.b" pred volaním funkcie "+ ob.a +" "+ ob.b); C.exchange (C); // volanie podľa odkazu. system.out.println ("hodnota ob.a" a "ob.b" pred volaním funkcie "+ ob.a +" "+ ob.b); }} // výstupná hodnota 'ob.a' a 'ob.b' pred volaním funkcie 20 40 hodnota 'ob.a' a 'ob.b' po volaní funkcie 40 20 

Kľúčové rozdiely medzi hodnotami hovoru podľa hodnôt a odkazom na výzvu

  1. Odovzdanie argumentu pomocou prístupu "volanie podľa hodnoty" prechádza len kópiu tejto premennej, takže zmeny vykonané v kópii tejto premennej neovplyvnia pôvodnú hodnotu tejto premennej. V prístupe "volanie podľa referencie" sa samotná premenná odovzdáva ako argument, takže jej zmeny menia hodnotu pôvodnej premennej.
  2. Ak sú odovzdané argumenty primitívne dátové typy, sú to jednoducho "volanie podľa hodnoty", ale ak sú odovzdané referencie / adresy argumentov alebo objektov, potom sa funkcia nazýva metódou "call by reference".
  3. V prístupe "call by value" sú argumenty prenesené iba názvom premenných, zatiaľ čo v príkaze "call by reference" sú argumenty prenesené, názov premennej pozdĺž znaku '&' alebo objekt, ktorý je odovzdaný len jeho menom.
  4. Príjem parametrov argumentu v prístupe "volanie podľa hodnoty" je názov premennej spolu s jej typom údajov. V prístupe "volanie podľa referencie" je prijímací parameter vždy ukazovateľ ukazovateľ spolu s dátovým typom a v prípade objektu je to názov objektu spolu s jeho typom triedy.

záver:

C ++ a Java používajú oba prístupy v závislosti od toho, čo prešlo. Ak chcete odovzdať iba hodnotu premenlivej metódy používania "podľa hodnoty" a ak chcete vidieť zmenu pôvodnej hodnoty premennej, použite prístup "volanie podľa referencie".

Top