Vertailukaavio:
Vertailun perusteet | Call_By_Value | Puheluohje |
---|---|---|
perustiedot | Muuttujan kopio siirretään. | Itse muuttuja siirretään. |
Vaikutus | Muutos muuttujassa ei muuta alkuperäisen arvon muuttuvan puolen toimintoa. | Muuttujan muutos vaikuttaa myös funktion ulkopuolella olevan muuttujan arvoon. |
Soittoparametrit | function_name (muuttuja_nimi1, muuttuja_nimi2, ...); | toiminto_nimi (& muuttuja_nimi1, & muuttuja_nimi2, ...); // esineen tapauksessa object.func_name (objekti); |
Vastaanottoparametrit | kirjoita 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) {. . } |
Oletuspuhelu | primitiivinen 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älkeenKeskeiset erot puhelujen ja arvon mukaan
- 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.
- 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ä.
- '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.
- 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.