Erinevus Call by Value ja Call by Reference
Peamised erinevused kõne väärtuse ja viitepõhise kõne vahel
- Meetodi Call by value puhul algväärtust ei muudeta, võrdlusmeetodil Call by value algväärtust aga ei muudeta.
- Funktsioonis Call by value edastatakse muutuja koopia, samas kui funktsioonis Call by reference edastatakse muutuja ise.
- Funktsioonis Call by value luuakse tegelikud ja formaalsed argumendid erinevatesse mälukohtadesse, samas kui Call by reference puhul luuakse tegelikud ja formaalsed argumendid samasse mälukohta.
- Kõne väärtuse järgi on vaikemeetod sellistes programmeerimiskeeltes nagu C++, PHP, Visual Basic NET ja C#, samas kui viitekõnet toetatakse ainult järgmistes versioonides Java keel.
- Muutujate väljakutsumine väärtuse järgi edastatakse lihtsal meetodil, samas kui muutujate aadresside salvestamiseks on vaja viitepõhise kõne viiteid.
Programmeerimiskeeltes saab funktsioone kutsuda kahel viisil: mida tuntakse kui Call by Value ja Call by Reference.
Mis on Call by Value meetod?
Väärtuse järgi kutsumise meetod kopeerib argumendi väärtuse selle funktsiooni formaalsesse parameetrisse. Seetõttu ei mõjuta põhifunktsiooni parameetris tehtud muudatused argumenti.
Selle parameetrite edastamise meetodi puhul kopeeritakse tegelike parameetrite väärtused funktsiooni formaalsetesse parameetritesse ja parameetrid salvestatakse erinevatesse mälukohtadesse. Seega ei kajastu funktsioonide sees tehtud muudatused helistaja tegelikes parameetrites.
Mis on kõne viitemeetod?
Viitemeetodil kutsumine kopeerib argumendi aadressi formaalsesse parameetrisse. Selle meetodi puhul kasutatakse aadressi juurdepääsuks funktsioonikutses kasutatud tegelikule argumendile. See tähendab, et parameetris tehtud muudatused muudavad läbimise argumenti.
Selle meetodi puhul on mälu eraldamine sama, mis tegelikud parameetrid. Kõik funktsiooni toimingud tehakse tegeliku parameetri aadressile salvestatud väärtusega ja muudetud väärtus salvestatakse samale aadressile.
C-kood Näide kõne väärtuse järgi meetodist
void main() { int a = 10, void increment(int); Cout << "before function calling" << a; increment(a); Cout << "after function calling" << a; getch(); void increment(int x) { int x = x + 1; Cout << "value is" << x; }
Väljund:
before function calling 10 value is 11 after function calling 1-0
Kuna muutuja, mis on deklareeritud 'a'in main() erineb muutujast 'x' increment(). Selles programmis on sarnased ainult muutujate nimed, kuid nende mäluaadress on erinev ja salvestatud erinevatesse mälukohtadesse.
Java Koodinäide kõne viitemeetodi järgi
Public static void main(string args[]) { int a = 10; System.out.println("Before call Value of a = ", a); Void increment(); System.out.println("After call Value of a = ", a); } Void increment(int x) { int x = x + 1; }
Väljund:
Before call Value of a =10 After call Value of a =11
Kuna muutuja, mis on deklareeritud 'a', viitab/ osutab muutujale 'a' in main(). Siin on muutuja nimi erinev, kuid mõlemad osutavad samadele mäluaadressi asukohtadele.
Helista väärtuse alusel vs. helistamise järgi
parameetrid | Helistage väärtuse järgi | Helistage viitega |
---|---|---|
Määratlus | Funktsiooni kutsumise ajal, kui edastate väärtusi muutujaid kopeerides, nimetatakse seda "Call by Values". | Funktsiooni kutsumisel kasutatakse programmeerimiskeeles muutujate väärtuste kopeerimise asemel muutujate aadressi, mida tuntakse kui "Call By References". |
Argumendid | Selle meetodi puhul edastatakse muutuja koopia. | Selle meetodi puhul edastatakse muutuja ise. |
Mõju | Muutuja koopias tehtud muudatused ei muuda kunagi muutuja väärtust väljaspool funktsiooni. | Muutuja muutumine mõjutab ka funktsiooni välist muutuja väärtust. |
Väärtuse muutmine | Ei võimalda teil tegelikes muutujates muudatusi teha. | Võimaldab funktsioonikutsete abil muuta muutujate väärtusi. |
Muutuja läbimine | Muutujate väärtused edastatakse lihtsal meetodil. | Osutimuutujad on vajalikud muutujate aadresside salvestamiseks. |
Väärtuse muutmine | Algväärtust ei muudetud. | Algväärtust muudetakse. |
Mälu asukoht | Tegelikud ja formaalsed argumendid luuakse erinevates mälu asukoht |
Tegelikud ja formaalsed argumendid luuakse samas mälu asukoht |
ohutus | Tegelikud argumendid jäävad alles ohutud, kuna neid ei saa muuta kogemata. |
Tegelikud argumendid ei ole Ohutu. Nad võivad olla kogemata muudetud, seega peate argumentide toiminguid hoolikalt käsitlema. |
vaikimisi | Vaikimisi paljudes programmeerimises keeled nagu C++.PHP. Visual Basic NET ja C#. |
Seda toetab enamik programmeerimiskeeled nagu JAVA, kuid mitte vaikimisi. |
Call by value meetodi kasutamise eelised C-s
Kõne plussid/kasud väärtuse järgi C-s:
- Meetod ei muuda algset muutujat, seega säilitab see andmeid.
- Kui funktsiooni seda nimetatakse, ärge kunagi mõjutage tegelike argumentide sisu.
- Tegelike argumentide väärtus läks üle formaalsetele argumentidele, seega ei mõjuta formaalsetes argumentides tehtud muudatused tegelikke juhtumeid.
Kõne võrdlusmeetodil kasutamise eelised
Võrdlusmeetodil kõne kasutamise plussid:
- Funktsioon võib muuta argumendi väärtust, mis on üsna kasulik.
- See ei loo dubleerivaid andmeid ainult ühe väärtuse hoidmiseks, mis aitab teil mäluruumi säästa.
- Selle meetodi puhul pole esitatud argumendi koopiat. Seetõttu töödeldakse seda väga kiiresti.
- Aitab vältida kogemata tehtud muudatusi
- Koodi lugev inimene ei tea kunagi, et väärtust saab funktsioonis muuta.
Call by value method kasutamise puudused
Siin on väärtusmeetodi järgi kõne peamised miinused/miinused:
- Tegelike parameetrite muudatused võivad muuta ka vastavaid argumendimuutujaid
- Selle meetodi puhul peavad argumendid olema muutujad.
- Funktsiooni kehas muutujat otseselt muuta ei saa.
- Mõnikord võivad argumendid olla keerulised väljendid
- Sama muutuja jaoks on loodud kaks koopiat, mis ei ole mälutõhus.
Kõne võrdlusmeetodil kasutamise puudused
Siin on võrdlusmeetodil helistamise kasutamise peamised miinused:
- Tugev mitte-tühine garantii. Funktsioon, mis võtab viidet, peab tagama, et sisend ei oleks null. Seetõttu pole nullkontrolli vaja teha.
- Viitega läbimine muudab funktsiooni teoreetiliselt mitte puhtaks.
- Eluaegne garantii on viidetega suur probleem. See on eriti ohtlik lambdade ja mitme keermega programmidega töötamisel.