Tablica usporedbe:
Osnova za usporedbu | Call_By_Value | Poziv prema referenci |
---|---|---|
Osnovni, temeljni | Prošla je kopija varijable. | Prošla je sama varijabla. |
Posljedica | Promjena u kopiji varijable ne mijenja prvobitnu vrijednost varijable out stranu funkcije. | Promjena u varijabli također utječe na vrijednost varijable izvan funkcije. |
Pozivanje parametara | ime_funkcije (varijable_ime1, varijable_ime2, ...); | ime_funkcije (& varijable_ime1, i varijable_ime2, ...); // u slučaju objekta object.func_name (objekt); |
Parametri primanja | upišite ime_funkcije (upišite variable_name1, upišite variable_name2, ...) {., } | upišite ime_funkcije (upišite * promjenjivo_ime1, upišite * promjenjivo_ime2, ...)., } // u slučaju objekta upišite ime_funkcije (tip klase ime_objekta) {., } |
Zadani poziv | primitivni tip se prosljeđuje pomoću "call by value". | Objekti su implicitno proslijeđeni pomoću "poziv po referenci". |
Definicija vrijednosti po pozivu
Ako proslijedite primitivni tip podataka (cijeli broj, znak i niz) funkciji / metodi, tada se samo njezina "vrijednost" prosljeđuje kodu funkcije. Funkcija kopira tu vrijednost argumenta u 'formalni parametar' funkcije koda. Ako postoji bilo kakva modifikacija formalnog parametra u kodu funkcije, on neće mijenjati izvornu vrijednost argumenta koji se koristi za pozivanje te funkcije.
Jednostavnim riječima, ako se funkcija / metoda naziva pristupom po pozivu; tada se kopija varijable prosljeđuje kodu funkcije. Ako kod funkcije napravite bilo kakve promjene u vrijednosti u kopiji varijable, ona ne mijenja izvornu vrijednost varijable.
Pogledajmo primjer kako bismo to kratko shvatili.
// primjer u Java klasi provjerite {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("vrijednost parametra unutar funkcije"); system.out.println ("vrijednost" i "koja prihvaća vrijednost argumenta" a "" + i); system.out.println ("vrijednost 'j' koja prihvaća vrijednost argumenta 'b'" + j); }} klasa call_by _value {public static void main (string args []) {int a = 12, b = 20; označite C = novi ček (); system.out.println ("vrijednost" a "i" b "prije poziva funkcije" + a + "" + b); C.change (a, b); // poziv po vrijednosti. system.out.println ("vrijednost" a "i" b "nakon poziva funkcije" + a + "" + b); }} // izlazna vrijednost 'a' i 'b' prije funkcije poziva 12 20 vrijednost parametra unutar vrijednosti funkcije 'i' koja prihvaća vrijednost argumenta 'a' 144 vrijednost 'j' koja prihvaća vrijednost od argument 'b' 10 vrijednost 'a' i 'b' nakon poziva funkcije 12 20
Definicija poziva prema referenci
Call by Reference metoda prosljeđuje referencu / adresu argumenta funkcijskom kodu. Kako se adresa argumenta prosljeđuje kodu funkcije, formalni parametar koji prihvaća tu adresu bio bi varijabla 'pokazivača'. Sada, kako je funkcija funkcije dobila adresu argumenta, modifikacija vrijednosti argumenta također će izmijeniti izvornu vrijednost argumenta.
U C + + i Javi, vrlo je uobičajeno da se objekt proslijedi funkciji / metodi i objekt se uvijek prosljeđuje njegovom referencom. Promjene na objektu unutar funkcije / metode utječu na objekt koji se koristi za pozivanje te funkcije / metode.
Slijedeći fragment pokazuje ispravan način "pozivanja prema referenci".
// primjer u C + + klase swap {void swap (int * x, int * y) {int temp; temp = * x; * X = y *; * Y = temp; }} int main {int a = 10, b = 20; cout << "vrijednost a, b prije poziva funkcije" << a << "" <Sada razmotrimo 'poziv po referenci' tako da 'objekt' proslijedimo kao argument, koji se implicitno prosljeđuje pristupom 'poziv po referenci'.
provjera razreda {int a, b; check (int x, int b) {// objekt inicijaliziran kroz ovaj konstituktor a = x; b = y; } razmjena praznina (check ob) {ob.a = a * 2; ob.b = b / 2; }} klasa main_class {javna statična nevažeća glavna (string args []) {provjeriti C = nova provjera (20, 40); // inicijalizacija objekata. system.out.println ("vrijednost" ob.a "i" ob.b "prije poziva funkcije" + ob.a + "" + ob.b); C.exchange (C); // poziv prema referenci. system.out.println ("vrijednost" ob.a "i" ob.b "prije poziva funkcije" + ob.a + "" + ob.b); }} // izlazna vrijednost 'ob.a' i 'ob.b' prije poziva funkcije 20 40 'ob.a' i 'ob.b' nakon poziva funkcije 40Ključne razlike između vrijednosti poziva i poziva po pozivu
- Prosljeđivanje argumenta korištenjem pristupa 'poziv po vrijednosti' prosljeđuje samo kopiju te varijable, tako da promjene u vrijednosti u kopiji te varijable ne utječu na izvornu vrijednost te varijable. U pristupu 'call by reference' varijabla se prosljeđuje kao argument, pa se mijenja tako da mijenja vrijednost izvorne varijable.
- Ako su argumenti prošli primitivni tipovi podataka, oni su jednostavno 'call by value', ali ako su reference / adrese argumenata ili objekata proslijeđene onda se funkcija poziva metodom 'call by reference'.
- U pristupu 'call by value' argumenti su samo ime varijabli, dok se u 'call by reference' pristupa argumentima koji su prošli, nazivu varijable uz znak '&', ili objektu koji je proslijeđen samo njegovim imenom.
- Primanje parametara argumenta u pristupu 'call by value' je ime varijable zajedno s tipom podataka. U pristupu 'poziv po referenci' parametar primanja je uvijek varijabla pokazivača zajedno s tipom podataka, au slučaju objekta to je ime objekta zajedno s vrstom razreda.
Zaključak:
C ++ i Java koriste oba pristupa ovisno o tome što je prošlo. Ako želite proći samo vrijednost varijable use'call by value 'pristup i ako želite vidjeti promjenu u izvornoj vrijednosti varijable onda koristite' call by reference 'pristup.