Sammenligningstabel:
Grundlag for sammenligning | Call_By_Value | Ring ved henvisning |
---|---|---|
Grundlæggende | En kopi af variablen er bestået. | En variabel i sig selv er bestået. |
Effekt | Ændring i en kopi af variabel ændrer ikke den oprindelige værdi af variabel ud side funktionen. | Ændring i variablen påvirker også værdien af variabel uden for funktionen. |
Opkaldsparametre | function_name (variable_name1, variable_name2, ...); | function_name (& variable_name1, & variable_name2, ...)); // i tilfælde af objekt object.func_name (objekt); |
Modtageparametre | skriv funktionnavn (skriv variabelnavn1, skriv variabelnavn2, ....) {. . } | skriv funktionnavn (type * variable_name1, type * variable_name2, ....) {. . } // i tilfælde af objekt skriv funktionnavn (klasse_type objektnavn) {. . } |
Standardopkald | primitiv type er bestået ved hjælp af "call for value". | objekter er implicit vedtaget ved hjælp af "call by reference". |
Definition af opkald efter værdi
Hvis du overfører en primitiv datatype (heltal, tegn og streng) til en funktion / metode, bliver kun "værdi" overført til funktionskoden. Funktionen kopierer denne værdi af et argument til en 'formel parameter' af funktionskoden. Hvis der er nogen ændring af den formelle parameter i en funktionskode, ændrer den ikke den oprindelige værdi af argumentet, der bruges til at kalde den pågældende funktion.
I enkle ord, hvis en funktion / metode kaldes ved 'call by value' tilgang så sendes en kopi af variablen til funktionskoden. Hvis en funktionskode gør ændringer i værdien i kopi af variablen, ændrer den ikke den oprindelige værdi af variablen.
Lad os se et eksempel for at forstå dette kort.
// eksempel i Java klassekontrol {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("værdi af parameter inde i funktionen"); system.out.println ("værdi af 'i' som accepterer værdien af argumentet 'a'" + i); system.out.println ("værdi af 'j', der accepterer værdien af argumentet 'b'" + j); }} class call_by _value {public static void main (string args []) {int a = 12, b = 20; tjek C = ny check (); system.out.println ("værdi af 'a' og 'b' før funktionsopkald" + a + "" + b); C.change (a, b); // ring efter værdi. system.out.println ("værdi af 'a' og 'b' efter funktionsopkald" + a + "" + b); }} // output værdi af 'a' og 'b' før funktionsopkald 12 20 værdi af parameter inde i funktionsværdien af 'i', som accepterer værdien af argumentet 'a' 144 værdi af 'j', der accepterer værdien af argument 'b' 10 værdi af 'a' og 'b' efter funktionsopkald 12 20
Definition af opkald ved henvisning
Opkald ved Reference metode sender en reference / adresse til et argument til funktionskoden. Da adressen til et argument sendes til funktionskoden, vil den formelle parameter, der accepterer denne adresse, være en "peger" -variabel. Nu, som funktionskode har fået adressen til et argument, ændrer ændringen i værdien af et argument også den oprindelige værdi af et argument.
I C ++ og Java er det meget almindeligt at videregive objektet til funktionen / metoden, og objektet er altid bestået af dets reference. Ændringer foretaget til objektet inde i funktionen / metoden påvirker objektet, der bruges til at påberåbe sig den pågældende funktion / metode.
Følgende fragment viser den korrekte måde at "kalde ved reference".
// eksempel i C ++ klasse swap {void swap (int * x, int * y) {int temp; temp = * x; * X = * y; * Y = temp; }} int main {int a = 10, b = 20; cout << "værdien af a, b før funktionsopkaldet" << a << "" <Lad os nu diskutere 'call by reference' ved at sende et 'objekt' som et argument, som implicit er bestået af tilgangen 'call by reference'.
klassekontrol {int a, b; check (int x, int b) {// objekt initialiseret gennem denne constrtuctor a = x; b = y; } tomrumsudveksling (check ob) {ob.a = a * 2; ob.b = b / 2; }} klasse main_class {public static void main (string args []) {tjek C = ny check (20, 40); // objekt initialisering. system.out.println ("værdi af 'ob.a' og 'ob.b' før funktionsopkald" + ob.a + "" + ob.b); C.exchange (C); // ring ved henvisning. system.out.println ("værdi af 'ob.a' og 'ob.b' før funktionsopkald" + ob.a + "" + ob.b); }} // output værdi af 'ob.a' og 'ob.b' før funktionsopkald 20 40 værdi af 'ob.a' og 'ob.b' efter funktionsopkald 40 20Nøgleforskelle mellem opkald efter værdi og opkald ved henvisning
- Passerer argumentet ved hjælp af 'Call for Value' tilgang passerer kun kopien af denne variabel, så ændringer, der foretages til værdien i kopien af denne variabel, påvirker ikke den oprindelige værdi af denne variabel. I 'call by reference' tilgangen er variablen selv bestået som et argument, så ændringer til det ændrer værdien af den oprindelige variabel.
- Hvis argumenterne er primitive datatyper, er de simpelthen 'call by value', men hvis referencerne / adresserne på argumenterne eller objekterne er bestået, kaldes en funktion ved 'call by reference' metode.
- I 'Call for Value Approach' er de argumenter, der er bestået, kun navnene på variabler, mens de argumenter, der er bestået, i 'Call by Reference' -tilgangen er variabelnavn sammen med '&' -tegn eller et objekt, der er bestået lige ved dets navn.
- Modtagelse af parametre for argumentet i 'call for value' tilgang er variabelt navn sammen med dets datatype. I 'opkald ved reference' tilgang er modtagermålet altid en pointervariabel sammen med datatypen og i tilfælde af objekt er det et objektnavn sammen med sin klassetype.
Konklusion:
C ++ og Java bruger begge tilgange afhængigt af hvad der er bestået. Hvis du kun vil videregive værdien af variabel use'call by value 'tilgang, og hvis du vil se ændringen i den oprindelige værdi af variablen, skal du bruge' call by reference 'tilgang.