
Salīdzināšanas diagramma:
Salīdzinājuma pamats | Call_By_Value | Zvanīšana pēc atsauces |
---|---|---|
Pamata | Tiek mainīts mainīgā kopija. | Tiek mainīts pats mainīgais. |
Ietekme | Mainot mainīgā lieluma kopiju, funkcija nemaina mainīgās izejas puses sākotnējo vērtību. | Mainīgais mainīgais ietekmē mainīgā vērtību ārpus funkcijas. |
Zvanīšanas parametri | function_name (mainīgais_nosaukums1, mainīgais_nosaukums2, ...); | function_name (& mainīgais_nosaukums1, un mainīgais_nosaukums2, ...); // objekta gadījumā object.func_name (objekts); |
Parametru saņemšana | ierakstiet function_name (ierakstiet mainīgo_nosaukumu1, ierakstiet mainīgo_nosaukumu2, ...) {. . } | ierakstiet funkciju_nosaukums (ierakstiet * mainīgais_nosaukums1, ierakstiet * mainīgais_nosaukums2, ...) {. . } // objekta gadījumā ierakstiet funkciju_nosaukums (class_type object_name) {. . } |
Noklusētais zvans | primitīvais tips tiek nodots, izmantojot "zvanu pēc vērtības". | objekti tiek netieši nodoti, izmantojot "zvanu pēc atsauces". |
Zvana pēc vērtības definīcija
Ja jūs nododat primitīvu datu tipu (vesels skaitlis, raksturs un virkne) funkcijai / metodei, tad tikai tā vērtība tiek nodota funkciju kodam. Funkcija kopē šo argumenta vērtību uz funkciju koda “formālo parametru”. Ja funkciju kodā ir izmaiņas formālajā parametrā, tas nemainīs argumenta sākotnējo vērtību, ko izmanto, lai izsauktu šo funkciju.
Vienkārši runājot, ja funkcija / metode tiek saukta ar “zvanu pēc vērtības” pieeju; tad mainīgā lieluma kopija tiek nodota funkciju kodam. Ja funkcijas kods maina mainīgā lieluma vērtību, tas nemaina mainīgā sākotnējo vērtību.
Redzēsim piemēru, lai to īsi saprastu.
// piemērs Java klases pārbaudē {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("parametra vērtība funkcija"); system.out.println ("vērtība" i ", kas pieņem argumenta" a "" + i) vērtību; system.out.println ("vērtība" j, kas pieņem argumenta "b" "+ j" vērtību); }} klase call_by _value {public static void main (virkne args []) {int a = 12, b = 20; pārbaude C = jauna pārbaude (); system.out.println ("vērtība" a "un" b "pirms funkciju izsaukuma" + a + "" + b); C. maiņa (a, b); // zvans pēc vērtības. system.out.println ("vērtība" a "un" b "pēc funkcijas izsaukuma" + a + "" + b); }} // izejas vērtība “a” un “b” pirms funkcijas izsaukuma parametra 12 20 vērtības vērtība i, kas pieņem argumenta vērtību “144” vērtību “j”, kas pieņem vērtību “j”, kas pieņem vērtību arguments "b" 10 "a" un "b" vērtība pēc funkcijas izsaukuma 12 20
Zvana atsauces definīcija
Izsaukuma atsauces metode nodod atsauces numuru / argumentu par funkciju kodu. Tā kā argumenta adrese tiek nodota funkciju kodam, formālais parametrs, kas pieņem šo adresi, būtu "rādītāja" mainīgais. Tagad, kad funkcijas kods ir saņēmis argumenta adresi, argumenta vērtības izmaiņas arī mainīs argumenta sākotnējo vērtību.
C + + un Java režīmā ir ļoti bieži nodot objektu uz funkciju / metodi, un objekts vienmēr tiek nodots ar tās atsauci. Izmaiņas, kas veiktas objekta iekšpusē funkcijas / metodes ietvaros, ietekmē objektu, ko izmanto, lai atsauktos uz šo funkciju / metodi.
Sekojošais fragments parāda pareizo veidu, kā “izsaukt atsauci”.
// piemērs C + + klases mijmaiņas darījumā {void swap (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = temp; }} int main {int a = 10, b = 20; cout << "vērtība a, b pirms funkcijas izsaukuma" << a << "" <Tagad diskutēsim par “izsaukumu ar atsauci”, nododot “objektu” kā argumentu, ko netieši nodod pie pieejas “izsaukuma ar atsauci”.
klases pārbaude {int a, b; pārbaude (int x, int b) {// objekts, kas inicializēts caur šo konstantu a = x; b = y; } tukša apmaiņa (pārbaude ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (virkne args []) {pārbaude C = jauna pārbaude (20, 40); // objekta inicializācija. system.out.println ("vērtība" ob.a "un" ob.b "pirms funkciju izsaukuma" + ob.a + "" + ob.b); C. apmaiņa (C); // zvans pēc atsauces. system.out.println ("vērtība" ob.a "un" ob.b "pirms funkciju izsaukuma" + ob.a + "" + ob.b); }} // izejas vērtība 'ob.a' un 'ob.b' pirms funkcijas izsaukuma 20 40 vērtība 'ob.a' un 'ob.b' pēc funkcijas izsaukuma 40 20Galvenās atšķirības starp zvanu pēc vērtības un izsaukuma pēc atsauces
- Argumenta nodošana, izmantojot pieeju “zvanu pēc vērtības”, ir tikai šī mainīgā kopija, tāpēc izmaiņas, kas izdarītas mainīgā lieluma vērtībā, neietekmē šī mainīgā lieluma sākotnējo vērtību. Piezīme “izsaukums pēc atsauces” pats par sevi tiek mainīts kā arguments, tāpēc izmaiņas tajā maina sākotnējā mainīgā vērtību.
- Ja pieņemtie argumenti ir primitīvi datu tipi, tie vienkārši ir “zvana pēc vērtības”, bet, ja argumentu vai objektu atsauces / adreses tiek nodotas, tad funkcija tiek saukta ar “zvanu pēc atsauces” metodi.
- Pieejamās vērtības noteikšanas pieejā pieņemtie argumenti ir tikai mainīgo lielumu nosaukums, savukārt “izsaukuma pēc atsauces” pieejas gadījumā pieņemtie argumenti ir, mainīgā nosaukums gar “&” zīmi, vai objekts, kas tiek nodots tikai pēc tā nosaukuma.
- Argumenta parametru saņemšana, izmantojot pieeju “zvana vērtība”, ir mainīgs nosaukums kopā ar datu tipu. Piezīme “zvans pēc atsauces” saņemšanas parametrs vienmēr ir rādītāja mainīgais kopā ar datu tipu un objekta gadījumā tas ir objekta nosaukums kopā ar tās klases tipu.
Secinājums:
C ++ un Java izmanto abas pieejas atkarībā no tā, kas ir pagājis. Ja vēlaties pārsniegt tikai mainīgās lietošanas vērtības vērtību pēc vērtības, un ja vēlaties redzēt mainīgā lieluma mainīgo vērtību, tad izmantojiet “zvanu pēc atsauces” pieeju.