Preporučeno, 2024

Izbor Urednika

Razlika između vrijednosti poziva i pozivanja prema pozivu

U C ++ i Java postoje dva načina za pozivanje funkcije ili metode. Prvi je "call by value", a drugi "call by reference". Metoda poziva prema vrijednosti prosljeđuje samo vrijednost varijable funkcijskom kodu, a ako postoji bilo kakva promjena u vrijednosti varijable unutar te funkcije, to ne utječe na izvornu vrijednost te varijable. U metodi call by reference proslijedimo samu varijablu u argument, a promjena vrijednosti varijable također utječe na izvornu vrijednost te varijable. Glavna razlika između obje metode jest, metoda call by value prolazi vrijednost varijable i poziv po referenci prolazi adresu te varijable.

Tablica usporedbe:

Osnova za usporedbuCall_By_ValuePoziv prema referenci
Osnovni, temeljni
Prošla je kopija varijable.Prošla je sama varijabla.
PosljedicaPromjena u kopiji varijable ne mijenja prvobitnu vrijednost varijable out stranu funkcije.Promjena u varijabli također utječe na vrijednost varijable izvan funkcije.
Pozivanje parametaraime_funkcije (varijable_ime1, varijable_ime2, ...);ime_funkcije (& varijable_ime1, i varijable_ime2, ...);
// u slučaju objekta
object.func_name (objekt);
Parametri primanjaupiš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 pozivprimitivni 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 40 

Ključne razlike između vrijednosti poziva i poziva po pozivu

  1. 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.
  2. 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'.
  3. 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.
  4. 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.

Top