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.