Doporučená, 2022

Redakce Choice

Rozdíl mezi výzvou podle hodnoty a volání podle reference

V C ++ a Java existují dva způsoby volání funkce nebo metody. První je „call by value“ a druhá je „call by reference“. Metoda volání podle hodnoty předává kód funkce pouze hodnotu proměnné a pokud dojde ke změně hodnoty proměnné uvnitř této funkce, neovlivní původní hodnotu této proměnné. Při volání metodou reference předáváme proměnnou samotnou v argumentu a změna hodnoty proměnné ovlivňuje také původní hodnotu této proměnné. Hlavní rozdíl mezi oběma metodami je, že metoda call by value předává hodnotu proměnné a volání odkazem předává adresu této proměnné.

Tabulka porovnání:

Základ pro porovnáníCall_By_ValueVolání podle reference
Základní
Kopie proměnné je předána.Proměnná samotná je předána.
ÚčinekZměna v kopii proměnné nemění původní hodnotu proměnné mimo stranu funkce.Změna proměnné ovlivňuje také hodnotu proměnné mimo funkci.
Parametry volánífunction_name (variable_name1, variable_name2, ...);function_name (& variable_name1, & variable_name2, ...);
// v případě objektu
object.func_name (object);
Parametry příjmutyp function_name (typ proměnné_název1, typ proměnné_název2, ...)
{. . }
typ function_name (typ * variable_name1, typ * variable_name2, ...) {. . }
// v případě objektu
typ function_name (class_type název_objektu)
{. . }
Výchozí voláníprimitivní typ je předán pomocí "call by value".objekty jsou implicitně předány pomocí "volání odkazem".

Definice hodnoty volání podle hodnoty

Pokud předáte funkci / metodu primitivní datový typ (celé číslo, znak a řetězec), pak je kód funkce předán pouze jeho hodnotě. Funkce zkopíruje tuto hodnotu argumentu do „formálního parametru“ kódu funkce. Pokud existuje nějaká modifikace formálního parametru v kódu funkce, neupraví původní hodnotu argumentu, který se používá pro volání této funkce.

V jednoduchých slovech, jestliže funkce / metoda je volána přístupem 'call by value'; pak je kopie proměnné předána kódu funkce. Pokud kód funkce provede jakékoli změny hodnoty v kopii proměnné, nezmění původní hodnotu proměnné.

Podívejme se na příklad, abychom to stručně pochopili.

 // příklad v třídě Java check {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("hodnota parametru uvnitř funkce"); system.out.println ("hodnota 'i', která akceptuje hodnotu argumentu 'a'" + i); system.out.println ("hodnota 'j', která přijímá hodnotu argumentu 'b'" + j); }} class call_by _value {public static void main (řetězec args []) {int a = 12, b = 20; kontrola C = nová kontrola (); system.out.println ("hodnota 'a' a 'b' před voláním funkce" + a + "" + b); C.změna (a, b); // volání hodnotou. system.out.println ("hodnota 'a' a 'b' po volání funkce" + a + "" + b); }} // výstupní hodnota 'a' a 'b' před voláním funkce 12 20 hodnota parametru uvnitř hodnoty funkce 'i', která akceptuje hodnotu argumentu 'a' 144 hodnota 'j', která přijímá hodnotu argument 'b' 10 hodnota 'a' a 'b' po volání funkce 12 20 

Definice volání odkazem

Metoda Call by Reference předá odkaz / adresu argumentu kódu funkce. Vzhledem k tomu, že adresa argumentu je předána kódu funkce, formálním parametrem, který tuto adresu akceptuje, bude proměnná „ukazatel“. Nyní, jak kód funkce získal adresu argumentu, změna hodnoty argumentu také změní původní hodnotu argumentu.

V C ++ a Java je velmi běžné předávat objekt funkci / metodu a objekt je vždy předán svým odkazem. Změny provedené na objektu uvnitř funkce / metody ovlivňují objekt použitý k vyvolání této funkce / metody.

Následující fragment ukazuje správný způsob „volání odkazem“.

 // příklad v C ++ class swap {void swap (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = temp; }} int main {int a = 10, b = 20; cout << "hodnota a, b před voláním funkce" << a << "" < 

Nyní pojďme diskutovat o „volání odkazem“ tím, že předáme „objekt“ jako argument, který je implicitně předán přístupem „volání odkazem“.

 kontrola třídy {int a, b; check (int x, int b) {// objekt inicializovaný tímto konstuktorem a = x; b = y; } neplatná výměna (kontrola ob) {ob.a = a * 2; ob.b = b / 2; }} třída main_class {public static void main (řetězec args []) {check C = nová kontrola (20, 40); // inicializace objektu. system.out.println ("hodnota" ob.a "a" ob.b "před voláním funkce" + ob.a + "" + ob.b); C. výměna (C); // volání odkazem. system.out.println ("hodnota" ob.a "a" ob.b "před voláním funkce" + ob.a + "" + ob.b); }} // výstupní hodnota 'ob.a' a 'ob.b' před voláním funkce 20 40 hodnota 'ob.a' a 'ob.b' po volání funkce 40 20 

Klíčové rozdíly mezi výzvou podle hodnoty a volání podle reference

  1. Předávání argumentu pomocí přístupu „call by value“ předává pouze kopii této proměnné, takže změny provedené na hodnotě v kopii této proměnné neovlivňují původní hodnotu této proměnné. V přístupu 'volání odkazem' proměnná samotná je předána jako argument, takže změny v ní mění hodnotu původní proměnné.
  2. Jsou-li předané argumenty primitivními datatypy, jsou jednoduše 'call by value', ale pokud jsou předány odkazy / adresy argumentů nebo objektů, pak je funkce volána metodou 'call by reference'.
  3. V 'call by value approach' jsou předané argumenty pouze názvem proměnných, zatímco v přístupu 'call by reference' jsou předané argumenty, název proměnné podél znaku „&" nebo objekt, který je předán pouze jeho jménem.
  4. Parametry přijímání argumentu v přístupu „call by value“ jsou proměnné spolu s datovým typem. V přístupu 'volání odkazem' je parametr příjem vždy proměnnou ukazatele spolu s datovým typem a v případě objektu je to název objektu spolu s typem třídy.

Závěr:

C ++ a Java používají oba přístupy v závislosti na tom, co je předáno. Chcete-li předat pouze hodnotu proměnné use'call by value 'a chcete-li vidět změnu původní hodnoty proměnné, použijte přístup „call by reference“.

Top