Suositeltava, 2024

Toimituksen Valinta

Puhelun ja arvon välinen puhelujen välinen ero

C ++: ssa ja Java: ssa on kaksi tapaa kutsua toiminto tai menetelmä. Ensimmäinen on "call by value" ja toinen "call by reference". Soiton arvo -menetelmä kulkee vain muuttujan arvon toimintokoodille, ja jos muuttujan arvoa muutetaan sen sisällä, se ei vaikuta kyseisen muuttujan alkuperäiseen arvoon. Viittausmenetelmässä puhelu siirtää itse muuttujan argumenttiin, ja muuttujan arvon muutos vaikuttaa myös kyseisen muuttujan alkuperäiseen arvoon. Tärkein ero molempien menetelmien välillä on, että puhelun arvo -menetelmä siirtyy muuttujan arvoon ja viittausviite siirtää kyseisen muuttujan osoitteen.

Vertailukaavio:

Vertailun perusteetCall_By_ValuePuheluohje
perustiedot
Muuttujan kopio siirretään.Itse muuttuja siirretään.
VaikutusMuutos muuttujassa ei muuta alkuperäisen arvon muuttuvan puolen toimintoa.Muuttujan muutos vaikuttaa myös funktion ulkopuolella olevan muuttujan arvoon.
Soittoparametritfunction_name (muuttuja_nimi1, muuttuja_nimi2, ...);toiminto_nimi (& muuttuja_nimi1, & muuttuja_nimi2, ...);
// esineen tapauksessa
object.func_name (objekti);
Vastaanottoparametritkirjoita funktion_nimi (kirjoita muuttuja_nimi1, kirjoita muuttuja_nimi2, ...)
{. . }
kirjoita funktion_nimi (kirjoita * muuttuja_nimi1, kirjoita * muuttuja_nimi2, ...) {. . }
// esineen tapauksessa
kirjoita funktion_nimi (class_type object_name)
{. . }
Oletuspuheluprimitiivinen tyyppi siirretään käyttämällä "call by value".kohteet siirretään implisiittisesti käyttämällä "puhelu viitteellä".

Puhelun arvon määrittely

Jos siirrät primitiivisen tietotyypin (kokonaisluku, merkki ja merkkijono) funktiolle / menetelmälle, vain sen "arvo" siirretään toimintokoodille. Funktio kopioi argumentin arvon funktiokoodin "muodolliseen parametriin". Jos funktiokoodissa on muutoksia muodolliseen parametriin, se ei muuta sen argumentin alkuperäistä arvoa, jota käytetään kyseiseen toimintoon kutsumiseen.

Yksinkertaisilla sanoilla, jos funktiota / menetelmää kutsutaan "puhelun arvo" -menetelmällä; sitten muuttuja kopio siirretään toimintokoodille. Jos funktiokoodi tekee muutoksia muuttujan arvoon, se ei muuta muuttujan alkuperäistä arvoa.

Katsotaanpa esimerkkiä tämän ymmärtämiseksi lyhyesti.

 // esimerkki Java-luokan tarkistuksessa {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("parametrin arvo funktion sisällä"); system.out.println ("arvo" i ", joka hyväksyy argumentin arvon" a "" + i); system.out.println ("arvo j", joka hyväksyy argumentin arvon "b" "+ j); }} class call_by _value {public static void main (string args []) {int a = 12, b = 20; tarkista C = uusi tarkistus (); system.out.println ("arvo" a "ja" b "ennen funktion kutsua" + a + "" + b); C.change (a, b); // arvo arvon mukaan. system.out.println ("arvo" a "ja" b "funktion kutsun jälkeen" + a + "" + b); }} // 'a': n ja 'b': n lähtöarvo ennen funktion kutsumista 12 20 -arvon parametrille 'i': n funktion arvon sisällä, joka hyväksyy argumentin arvon '' 144 '-arvon' j ', joka hyväksyy arvon' j '. argumentti 'b' 10-arvo 'a' ja 'b' funktion puhelun jälkeen 12 20 

Viittauksen määritelmä

Call by Reference -menetelmä siirtää argumentin viitteen / osoitteen toimintokoodille. Koska argumentin osoite siirretään toimintokoodille, muodollinen parametri, joka hyväksyy tämän osoitteen, olisi "osoitin" muuttuja. Nyt, kun funktiokoodi on saanut argumentin osoitteen, argumentin arvon muuttaminen muuttaa myös argumentin alkuperäistä arvoa.

C ++: ssa ja Java: ssa on hyvin yleistä, että objekti siirretään funktiolle / menetelmälle, ja esine läpäisee aina sen viittauksen. Toiminnon / menetelmän sisällä olevaan kohteeseen tehdyt muutokset vaikuttavat kohteeseen, jota käytetään kyseisen toiminnon / menetelmän käyttämiseen.

Seuraava fragmentti näyttää oikean tavan kutsua viittauksella.

 // esimerkki C ++ -luokassa swap {void swap (int * x, int * y) {int temp; temp = * x; * X = * y; * Y = lämpötila; }} int main {int a = 10, b = 20; cout << "arvo a, b ennen funktion kutsumista" << a << "" < 

Nyt keskustellaan 'kutsusta viittauksella' siirtämällä 'objekti' argumentiksi, joka on implisiittisesti siirtynyt lähestymistavan "puhelu viitteellä".

 luokan tarkistus {int a, b; tarkista (int x, int b) {// objektin, joka on alustettu tämän konseptin a = x kautta; b = y; } tyhjä vaihto (check ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (string args []) {check C = uusi tarkistus (20, 40); // objektin alustus. system.out.println ("arvo ob.a" ja "ob.b" ennen funktion kutsua "+ ob.a +" "+ ob.b); C.exchange (C); // puhelu viitteenä. system.out.println ("arvo ob.a" ja "ob.b" ennen funktion kutsua "+ ob.a +" "+ ob.b); }} // lähtöarvo 'ob.a' ja 'ob.b' ennen funktion puhelun 20 40 arvoa 'ob.a' ja 'ob.b' funktion puhelun 40 20 jälkeen 

Keskeiset erot puhelujen ja arvon mukaan

  1. Argumentin siirtäminen käyttämällä arvopapereita koskevaa lähestymistapaa kulkee vain kyseisen muuttujan kopion, joten kyseisen muuttujan kopion arvoon tehdyt muutokset eivät vaikuta kyseisen muuttujan alkuperäiseen arvoon. 'Call by reference' -lähestymistavassa itse muuttuja annetaan argumenttina, joten sen muutokset muuttavat alkuperäisen muuttujan arvoa.
  2. Jos annetut argumentit ovat primitiivisiä datatyyppejä, ne ovat yksinkertaisesti "kutsua arvoon", mutta jos argumenttien tai objektien viitteet / osoitteet siirretään, funktio kutsutaan "puhelu viite" -menetelmällä.
  3. 'Soita arvoon perustuvassa lähestymistavassa' annetut argumentit ovat vain muuttujien nimiä, kun taas 'puhelu viitteellä' lähestymistavassa annetut argumentit ovat muuttujan nimi pitkin '&' -merkkiä, tai objekti, joka on annettu juuri sen nimen perusteella.
  4. Argumentin vastaanottoparametrit "puhelun arvo" -menetelmässä ovat muuttujan nimi ja sen tietotyyppi. 'Call by reference' -lähestymistavassa vastaanottoparametri on aina osoitinmuuttuja datatyypin kanssa ja objektin tapauksessa se on objektin nimi ja sen luokan tyyppi.

johtopäätös:

C ++ ja Java käyttävät molempia lähestymistapoja riippuen siitä, mitä ohitetaan. Jos haluat siirtää vain muuttujan käyttöarvon arvon, ja jos haluat nähdä muuttujan alkuperäisen arvon muutoksen, käytä puhelun viittausta.

Top