Rekomenduojama, 2024

Redaktoriaus Pasirinkimas

Skirtumas tarp pokalbių pagal vertę ir kvietimą pagal nuorodą

„C + +“ ir „Java“ yra du būdai skambinti funkcijai arba metodui. Pirmasis yra „skambinti pagal vertę“, o antrasis - „skambinti pagal nuorodą“. Skambučio pagal vertę metodas perduoda tik kintamojo vertę funkcijų kodui, o jei kintamasis kintamojo vertės viduje toje funkcijoje, tai neturi įtakos pirminiam kintamojo vertei. Skambučiu pagal referencinį metodą mes perduodame save kintamąjį argumente, o kintamojo vertės pokytis taip pat turi įtakos pirminiam kintamojo vertei. Pagrindinis skirtumas tarp abiejų metodų yra tai, kad skambučio vertės metodas pereina kintamojo vertę, o skambučio pagal referencinę reikšmę perduoda šio kintamojo adresą.

Palyginimo diagrama:

Palyginimo pagrindasCall_By_ValueKvietimas pagal nuorodą
Pagrindinis
Pasikeičiama kintamojo kopija.Pasikeičia pats kintamasis.
PoveikisKintamojo kopijos keitimas nekeičia pradinės kintamos pusės pusės vertės funkcijos.Kintamojo pokytis turi įtakos kintamojo vertei už funkcijos ribų.
Skambinimo parametraifunction_name (kintamasis_pavadinimas1, kintamasis_pavadinimas2, ...);function_name (& kintamasis_pavadinimas1 ir kintamasis_pavadinimas2, ...);
// objekto atveju
object.func_name (objektas);
Priėmimo parametraiįveskite function_name (įveskite kintamasis_pavadinimas1, įveskite kintamasis_pavadinimas2, ...)
{. . }
įveskite function_name (įveskite * változ ._pavadinimas1, įveskite * kintamasis_pavadinimas2, ...) {. . }
// objekto atveju
įveskite funkcijų_pavadinimą (class_type object_name)
{. . }
Numatytasis skambinimasprimityvus tipas perduodamas naudojant „skambinti pagal vertę“.objektai yra netiesiogiai perduodami naudojant „skambinti pagal nuorodą“.

Skambučio pagal vertę apibrėžtis

Jei perduodate primityvų duomenų tipą (sveikąjį skaičių, simbolį ir eilutę) į funkciją / metodą, tada tik jo „reikšmė“ perduodama funkcijų kodui. Funkcija kopijuoja tą argumento vertę į funkcijų kodo „oficialų parametrą“. Jei funkcijų kode yra formalių parametrų pakeitimas, jis nekeičia pradinės argumento vertės, kuri naudojama šiai funkcijai skambinti.

Paprastais žodžiais tariant, jei funkcija / metodas vadinamas „skambučio pagal vertę“ metodu; tada kintamojo kopija perduodama funkcijų kodui. Jei funkcijų kodas bet kokius kintamojo kopijos vertės pakeitimus keičia, jis nekeičia pradinės kintamojo vertės.

Pažiūrėkime, kaip tai trumpai suprasti.

 // pavyzdys Java klasės patikrinime {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("parametro reikšmė funkcijos viduje"); system.out.println ("vertė", kuri priima argumento "a" "+ i) vertę; system.out.println ("reikšmė" j, kuri priima argumento "b" "+ j" vertę); }} klasė call_by_value {public static void main (eilutė args []) {int a = 12, b = 20; čekis C = naujas patikrinimas (); system.out.println ("reikšmė" a "ir" b "prieš funkcijų iškvietimą" + a + "" + b); C. mainai (a, b); // skambinti pagal vertę. system.out.println ("reikšmė" a "ir" b "po funkcijos skambinimo" + a + "" + b); }} // išvesties reikšmė „a“ ir „b“ prieš funkciją skambinti 12 20 reikšmės parametro viduje „i“ funkcijos verte, kuri priima argumento „144“ vertės „j“ vertę, kuri sutinka su reikšme „j“ argumentas „b“ 10 „a“ ir „b“ reikšmių po funkcijų skambučio 12 20 

Kvietimo pagal nuorodą apibrėžtis

Skambučių pagal metodą metodas perduoda argumento nuorodą / adresą funkcijų kodui. Kadangi argumento adresas perduodamas funkcijų kodui, formalus parametras, priimantis šį adresą, būtų „rodyklės“ kintamasis. Dabar, kai funkcijos kodas gavo argumento adresą, argumento vertės pakeitimas taip pat pakeis pradinę argumento vertę.

„C + +“ ir „Java“ yra labai dažni, kad objektas būtų perduotas funkcijai / metodui, o objektas visada perduodamas jo nuoroda. Funkcijos / metodo objekto pakeitimai daro įtaką objektui, naudojamam šiai funkcijai / metodui.

Toliau pateiktas fragmentas rodo teisingą būdą „skambinti pagal nuorodą“.

 // pavyzdys C ++ klasės apsikeitimo {void swap (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = temp; }} int main {int a = 10, b = 20; cout << "reikšmė a, b prieš funkciją skambinti" << a << "" < 

Dabar aptarkime „kvietimą pagal nuorodą“, perduodami „objektą“ kaip argumentą, kuris netiesiogiai perduodamas pagal „kvietimą pagal nuorodą“.

 klasės patikrinimas {int a, b; čekis (int x, int b) {// objektas, inicijuotas per šį konstantą a = x; b = y; } negaliojantis keitimas (patikrinimas ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (eilutė args []) {čekis C = naujas čekis (20, 40); // Objekto inicijavimas. system.out.println („reikšmė„ ob.a “ir„ ob.b “prieš funkciją„ + ob.a + ““ + ob.b); C. mainai (C); // skambinti pagal nuorodą. system.out.println („reikšmė„ ob.a “ir„ ob.b “prieš funkciją„ + ob.a + ““ + ob.b); }} // išvesties reikšmė „ob.a“ ir „ob.b“ prieš funkciją skambinti 20 40 „ob.a“ ir „ob.b“ po funkcijos skambinimo 40 20 

Pagrindiniai skirtumai tarp skambučių pagal vertę ir kvietimą pagal nuorodą

  1. Jei argumentas perduodamas taikant „skambučių vertės“ metodą, jis tik perduoda šio kintamojo kopiją, taigi šio kintamojo kopijos vertės pakeitimai neturi įtakos pirminiam kintamojo vertei. „Skambučių pagal nuorodą“ metodu pats kintamasis perduodamas kaip argumentas, todėl jo pakeitimai pakeičia originalaus kintamojo vertę.
  2. Jei perduoti argumentai yra primityvūs duomenų tipai, jie paprasčiausiai yra „skambinti pagal vertę“, tačiau jei argumentų ar objektų nuorodos / adresai yra perduodami, tuomet funkcija vadinama „skambučiu pagal nuorodą“.
  3. „Skambučio pagal vertę“ metodu perduoti argumentai yra tik kintamųjų pavadinimas, o „skambučių pagal nuorodą“ metodu priimami argumentai, kintamojo pavadinimas palei „&“ ženklą, arba objektas, kuris yra perduotas tik pagal pavadinimą.
  4. Argumentų priėmimo parametrai „kvietimo pagal vertę“ metodu yra kintamojo pavadinimas kartu su jo duomenų tipu. Taikant „skambučio pagal nuorodą“ metodą, gaunamasis parametras visada yra rodyklės kintamasis kartu su duomenų tipu, o objekto atveju jis yra objekto pavadinimas kartu su klasės tipu.

Išvada:

„C ++“ ir „Java“ naudoja abu metodus, priklausomai nuo to, kas yra perduota. Jei norite perkelti tik kintamojo naudojimo „skambučio pagal vertę“ vertę ir jei norite matyti kintamojo pradinės vertės pokytį, naudokite „skambučio pagal nuorodą“ metodą.

Top