Rekommenderas, 2024

Redaktionen

Skillnad mellan call by value och call via referens

I C ++ och Java finns det två sätt att ringa en funktion eller en metod. Den första är "call by value" och den andra är "call by reference". Samtalsmetoden överför endast värdet på en variabel till funktionskoden, och om det finns någon ändring i värdet på en variabel inuti den funktionen påverkar den inte det ursprungliga värdet för den variabeln. I samtal med referensmetod överför vi variabeln själv i ett argument, och förändringen i värdet av en variabel påverkar också det ursprungliga värdet av den variabeln. Huvudskillnaden mellan båda metoderna är att metoden för samtal genom värdet passerar värdet av en variabel och anrop genom referens skickar adressen till den variabeln.

Jämförelsediagram:

Grunder för jämförelseCall_By_ValueRing via referens
Grundläggande
En kopia av variabeln passeras.En variabel i sig är godkänd.
EffektÄndring av en kopia av variabel ändrar inte det ursprungliga värdet av variabel ut sidan av funktionen.Ändring i variabeln påverkar också värdet av variabel utanför funktionen.
Samtalsparametrarfunktionsnamn (variabelnamn1, variabelnamn2, ...);funktionsnamn (& variabelnamn1, & variabelnamn2, ...));
// vid objekt
object.func_name (object);
Mottagande parametrarskriv funktionsnamn (skriv variabel_namn1, skriv variabel_namn2, ....)
{. . }
skriv funktionsnamn (typ * variable_name1, typ * variable_name2, ....) {. . }
// vid objekt
skriv funktionnamn (class_type object_name)
{. . }
Standardanropprimitiva typen skickas med "call by value".Objekt är implicit godkända med hjälp av "call by reference".

Definition av samtal efter värde

Om du skickar en primitiv datatyp (heltal, tecken och sträng) till en funktion / metod, skickas endast "värde" till funktionskoden. Funktionen kopierar det värdet av ett argument till en "formell parameter" av funktionskoden. Om det finns någon modifikation av den formella parametern i en funktionskod, ändras inte det ursprungliga värdet av argumentet som används för att ringa den funktionen.

I enkla ord, om en funktion / metod kallas för "call by value" då skickas en kopia av variabeln till funktionskoden. Om en funktionskod gör några ändringar i värdet i kopian av variabeln ändras inte det ursprungliga värdet av variabeln.

Låt oss se ett exempel för att förstå detta kortfattat.

 // exempel i Java klasskontroll {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("värdet av parametern inuti funktionen"); system.out.println ("value of 'i' som accepterar värdet av argumentet 'a'" + i); system.out.println ("värde av" j "som accepterar värdet av argumentet" b "" + j); }} class call_by _value {public static void main (sträng args []) {int a = 12, b = 20; kolla C = ny kontroll (); system.out.println ("värde av" a "och" b "före funktionssamtal" + a + "" + b); C.change (a, b); // ring efter värde. system.out.println ("värdet av" a "och" b "efter funktionssamtal" + a + "" + b); }} // Utgångsvärde för 'a' och 'b' före funktionssamtal 12 20 Värdet av parametern inuti funktionsvärdet för 'I' som accepterar värdet av argumentet 'a' 144 värde av 'j' som accepterar värdet av argumentet "b" 10 värde av "a" och "b" efter funktionskall 12 20 

Definition av samtal genom referens

Ring med referensmetod skickar en referens / adress till ett argument till funktionskoden. Eftersom adressen till ett argument skickas till funktionskoden, skulle den formella parametern som accepterar den adressen vara en "pekare" -variabel. Nu, som funktionskod har erhållit adressen till ett argument, ändrar modifikationen i värdet av ett argument också det ursprungliga värdet av ett argument.

I C ++ och Java är det mycket vanligt att skicka objektet till funktionen / metoden och objektet passeras alltid av dess referens. Ändringar gjorda till objektet inuti funktionen / metoden påverkar objektet som används för att åberopa den funktionen / metoden.

Följande fragment visar det rätta sättet att "ringa genom referens".

 // exempel i C ++ klassbyte {void swap (int * x, int * y) {int temp; temp = * x; * X = * y; * Y = temp; }} int huvud {int a = 10, b = 20; cout << "värdet av a, b före funktionssamtalet" << a << "" < 

Låt oss nu diskutera "call by reference" genom att skicka ett "objekt" som ett argument, vilket implicit överensstämmer med metoden "call by reference".

 klasskontroll {int a, b; kontrollera (int x, int b) {// objekt initierat genom denna constrtuctor a = x; b = y; } tomrumsutbyte (check ob) {ob.a = a * 2; ob.b = b / 2; }} klass main_class {public static void main (string args []) {kolla C = ny kontroll (20, 40); // objektinitiering. system.out.println ("värde av" ob.a "och" ob.b "före funktionssamtal" + ob.a + "" + ob.b); C.exchange (C); // Ring via referens. system.out.println ("värde av" ob.a "och" ob.b "före funktionssamtal" + ob.a + "" + ob.b); }} // utdatavärde för "ob.a" och "ob.b" före funktionssamtal 20 40 värde av "ob.a" och "ob.b" efter funktionssamtal 40 20 

Viktiga skillnader mellan call by value och call via referens

  1. Passerar argumentet med hjälp av "Call by Value" -metoden passerar endast kopian av den variabeln, så ändringar som görs till värdet i kopian av den variabeln påverkar inte det ursprungliga värdet för den variabeln. I "Call by Reference" -metoden passeras variabeln själv som ett argument, så ändringar i det ändrar värdet på den ursprungliga variabeln.
  2. Om argumenten passerade är primitiva datatyper är de helt enkelt "call by value", men om referenser / adresser till argumenten eller objekten skickas, kallas en funktion genom "call by reference" -metoden.
  3. I "Call for Value Approach" är argumenten som passerat endast namnet på variabler, medan de argumenter som passerat är variabla namn längs '&' -tecknet, eller ett objekt som passeras av dess namn.
  4. Att mottaga parametrar för argumentet i "call by value" -metoden är variabelt namn tillsammans med dess datatyp. I "Call by Reference" -tilgangen är mottagarparametern alltid en pekervariabel tillsammans med datatypen och när det gäller objekt är det ett objektnamn tillsammans med sin klasstyp.

Slutsats:

C ++ och Java använder båda metoderna beroende på vad som passeras. Om du bara vill skicka värdet för variabel användning 'call by value' och om du vill se förändringen i variabelns ursprungliga värde, använd sedan "call by reference" -metoden.

Top