Rozdíl mezi výzvou podle hodnoty a výzvou podle reference

Obsah:

Anonim

V programovacích jazycích lze funkce vyvolat dvěma způsoby: což je známé jako Call by Value a Call by Reference.

V tomto výukovém programu se naučíte,

  • Co je metoda volání podle hodnoty?
  • Co je metoda Call by Reference?
  • Příklad volání metodou hodnoty
  • Příklad volání referenční metodou
  • Call by Value vs. Call by Reference
  • Výhody použití metody Call by value
  • Výhody použití metody Call by reference
  • Nevýhody použití metody Call by value
  • Nevýhody použití metody Call by reference

Co je metoda Call by Value?

Metoda volání podle hodnoty zkopíruje hodnotu argumentu do formálního parametru této funkce. Změny provedené v parametru hlavní funkce proto neovlivní argument.

V této metodě předávání parametrů jsou hodnoty skutečných parametrů zkopírovány do formálních parametrů funkce a parametry jsou uloženy v různých paměťových umístěních. Takže jakékoli změny provedené uvnitř funkcí se neprojeví ve skutečných parametrech volajícího.

KLÍČOVÝ ROZDÍL

  • U metody Call by value se původní hodnota nemění, zatímco u metody Call by reference se původní hodnota upravuje.
  • V Call by value je předána kopie proměnné, zatímco v Call by reference je předána samotná proměnná.
  • V části Call by value budou skutečné a formální argumenty vytvořeny v různých umístěních paměti, zatímco v Call by reference budou skutečné a formální argumenty vytvořeny ve stejném umístění paměti.
  • Call by value je výchozí metoda v programovacích jazycích jako C ++, PHP, Visual Basic NET a C #, zatímco Call by reference je podporován pouze v jazyce Java.
  • Volání podle hodnoty, proměnné jsou předávány přímočarou metodou, zatímco volání odkazem, ukazatele jsou nutné k uložení adresy proměnných.

Co je metoda Call by Reference?

Call by reference method zkopíruje adresu argumentu do formálního parametru. V této metodě se adresa používá pro přístup ke skutečnému argumentu použitému při volání funkce. To znamená, že změny provedené v parametru mění předávající argument.

V této metodě je alokace paměti stejná jako skutečné parametry. Veškerá operace ve funkci se provádí na hodnotě uložené na adrese aktuálního parametru a upravená hodnota bude uložena na stejnou adresu.

Příklad metody Call by Value

void main() {int a = 10,void increment(int);Cout << "before function calling" << a;increment(a);Cout << "after function calling" << a;getch();void increment(int x) {int x = x + 1;Cout << "value is" << x;}

Výstup:

before function calling 10value is 11after function calling 1-0

Protože proměnná deklarovaná 'a'in main () se liší od proměnné' x 'v přírůstku (). V tomto programu jsou podobné pouze názvy proměnných, ale jejich adresy v paměti jsou odlišné a jsou uloženy na různých místech paměti.

Příklad metody Call by Reference

Public static void(string args[]) {int a = 10;System.out.println("Before call Value of a = ", a);Void increment();System.out.println("After call Value of a = ", a);}Void increment(int x) {int x = x + 1;}

Výstup:

Before call Value of a =10After call Value of a =11

Protože proměnná deklarovaná jako „a“ v odkazuje / ukazuje na proměnnou „a“ v main (). Zde se název proměnné liší, ale oba směřují / odkazují na stejná umístění adres paměti.

Call by Value vs. Call by Reference

Parametry Volání podle hodnoty Volejte odkazem
Definice Při volání funkce, když předáváte hodnoty kopírováním proměnných, je známá jako „Call By Values“. Při volání funkce se v programovacím jazyce místo kopírování hodnot proměnných používá adresa proměnných, která se označuje jako „Call By References“.
Argumenty V této metodě je předána kopie proměnné. V této metodě je předána samotná proměnná.
Účinek Změny provedené v kopii proměnné nikdy nezmění hodnotu proměnné mimo funkci. Změna proměnné ovlivní také hodnotu proměnné mimo funkci.
Změna hodnoty Neumožňuje provádět žádné změny ve skutečných proměnných. Umožňuje provádět změny hodnot proměnných pomocí volání funkcí.
Předávání proměnné Hodnoty proměnných se předávají přímočarou metodou. Proměnné ukazatele jsou nutné k uložení adresy proměnných.
Úprava hodnoty Původní hodnota nebyla změněna. Původní hodnota je změněna.
Umístění paměti Skutečné a formální argumenty budou vytvořeny v jiném umístění paměti Skutečné a formální argumenty budou vytvořeny ve stejném umístění paměti
Bezpečnost Aktuální argumenty zůstávají v bezpečí, protože je nelze náhodně upravit. Aktuální argumenty nejsou bezpečné. Mohou být omylem upraveny, takže s operacemi argumentů musíte zacházet opatrně.
Výchozí Výchozí v mnoha programovacích jazycích, jako je C ++. PHP. NET jazyka Visual Basic a C #. Je podporován většinou programovacích jazyků, jako je JAVA, ale ne jako výchozí.

Výhody použití metody Call by value

Výhody / výhody volání metodou hodnoty:

  • Metoda nemění původní proměnnou, takže zachovává data.
  • Kdykoli se jí funkce říká, nikdy to neovlivní skutečný obsah skutečných argumentů.
  • Hodnota skutečných argumentů předaných formálním argumentům, takže jakékoli změny provedené ve formálním argumentu neovlivní skutečné případy.

Výhody použití metody Call by reference

Pros použití volání referenční metodou:

  • Funkce může změnit hodnotu argumentu, což je docela užitečné.
  • Nevytváří duplicitní data pro uchovávání pouze jedné hodnoty, což vám pomůže ušetřit místo v paměti.
  • V této metodě neexistuje žádná kopie provedeného argumentu. Proto je zpracován velmi rychle.
  • Pomůže vám vyhnout se omylem provedeným změnám
  • Osoba, která čte kód, nikdy neví, že hodnotu lze ve funkci upravit.

Nevýhody použití metody Call by value

Zde jsou hlavní nevýhody / nevýhody volání metodou hodnoty:

  • Změny skutečných parametrů mohou také upravit odpovídající proměnné argumentů
  • V této metodě musí být argumenty proměnné.
  • Proměnnou v těle funkce nemůžete přímo změnit.
  • Někdy může být argumentem složitý výraz
  • Existují dvě kopie vytvořené pro stejnou proměnnou, která není paměťově efektivní.

Nevýhody použití metody Call by reference

Zde jsou hlavní nevýhody používání metody volání odkazem:

  • Silná nenulová záruka. Funkce přijímající odkaz se musí ujistit, že vstup má nenulovou hodnotu. Proto nemusí být provedena nulová kontrola.
  • Předávání odkazem činí tuto funkci teoreticky čistou.
  • Doživotní záruka je u referencí velkým problémem. To je zvláště nebezpečné při práci s lambdas a vícevláknovými programy.