Anbefalet, 2021

Redaktørens Valg

Forskel mellem opkald efter værdi og opkald ved henvisning

I C ++ og Java er der to måder at kalde en funktion eller en metode på. Den første er "call by value" og den anden er "call by reference". Opkald ved værdi metode overfører kun værdien af ​​en variabel til funktionskoden, og hvis der er nogen ændring i værdien af ​​en variabel inde i den funktion, påvirker den ikke den oprindelige værdi af den variable. I opkald ved reference metode overfører vi variablen selv i et argument, og ændringen i værdien af ​​en variabel påvirker også den oprindelige værdi af den variable. Den væsentligste forskel mellem begge metoderne er, at værdi for værdi af en variabel er værdien af ​​en metode, og kalder ved henvisning passerer adressen til denne variabel.

Sammenligningstabel:

Grundlag for sammenligningCall_By_ValueRing 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.
Opkaldsparametrefunction_name (variable_name1, variable_name2, ...);function_name (& variable_name1, & variable_name2, ...));
// i tilfælde af objekt
object.func_name (objekt);
Modtageparametreskriv funktionnavn (skriv variabelnavn1, skriv variabelnavn2, ....)
{. . }
skriv funktionnavn (type * variable_name1, type * variable_name2, ....) {. . }
// i tilfælde af objekt
skriv funktionnavn (klasse_type objektnavn)
{. . }
Standardopkaldprimitiv 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 20 

Nøgleforskelle mellem opkald efter værdi og opkald ved henvisning

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

Top