Soovitatav, 2020

Toimetaja Valik

Kõne väärtuse ja kõnede vahelise vahe

C ++ ja Java puhul on funktsiooni või meetodi nimetamiseks kaks võimalust. Esimene on "kõne väärtuse järgi" ja teine ​​on "kõne viitena". Kõne väärtuse meetod läbib ainult muutuja väärtuse funktsiooni koodile ja kui selle funktsiooni muutuja väärtus muutub, ei mõjuta see muutuja algset väärtust. Võrdlusmeetodi puhul edastame kõnesoleva muutuja argumendis ja muutuja muutus mõjutab ka muutuja algset väärtust. Mõlema meetodi peamine erinevus on see, et kõne väärtuse meetod läbib muutuja väärtuse ja kõne viitenumber läbib selle muutuja aadressi.

Võrdluskaart:

Võrdluse alusCall_By_ValueKõne viide
Põhiline
Muutujalt kantakse koopia.Muutuja ise on möödas.
MõjuMuutuja muutmine ei muuda funktsiooni muutuva väljapoole algset väärtust.Muutuja mõjutab muutuja väärtust ka väljaspool funktsiooni.
Helistaja parameetridfunktsiooni_nimi (muutuja_nimi1, muutuja_nimi2, ...);funktsiooni_nimi (& muutuja_nimi1, & muutuja_nimi2, ...);
// objekti puhul
object.func_name (objekt);
Parameetrite vastuvõtminetippige funktsiooni_nimi (tippige muutuja_nimi1, tippige muutuja_nimi2, ...)
{. . }
tippige funktsiooni_nimi (tüüp * muutuja_nimi1, tippige * muutuja_nimi2, ...) {. . }
// objekti puhul
tippige funktsiooni_nimi (class_type object_name)
{. . }
Vaikekõneprimitiivne tüüp edastatakse "kõne väärtuse järgi" abil.objekte edastatakse kaudselt, kasutades "kõne viitena".

Kõne väärtuse mõiste

Kui edastate funktsiooni / meetodi jaoks primitiivse andme tüübi (täisarv, märk ja string), siis edastatakse funktsiooni koodile ainult selle „väärtus”. Funktsioon kopeerib argumendi väärtuse funktsiooni koodi „formaalseks parameetriks”. Kui funktsiooni koodi ametlikus parameetris on mingeid muudatusi, ei muuda see argumenti algväärtust, mida kasutatakse selle funktsiooni helistamiseks.

Lihtsate sõnadega, kui funktsiooni / meetodit nimetatakse "kõne väärtuse" meetodil; seejärel edastatakse funktsiooni koodile muutuja koopia. Kui funktsiooni kood muudab muutuja väärtuses väärtust, ei muuda see muutuja algset väärtust.

Vaatame näite, et seda lühidalt mõista.

 // näide Java klassi kontrollis {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("parameetri väärtus funktsiooni sees"); system.out.println ("väärtus" i ", mis aktsepteerib argumenti" a "" + i) väärtust; system.out.println ("väärtus" j, mis aktsepteerib argumenti "b" "+ j) väärtust; }} klass call_by _value {public static void main (string args []) {int a = 12, b = 20; kontroll C = uus kontroll (); system.out.println ("väärtus" a "ja" b "enne funktsiooni kõnet" + a + "" + b); C.change (a, b); // väärtuse järgi. system.out.println ("väärtus" a "ja" b "pärast funktsiooni kõnet" + a + "" + b); }} // väljundväärtus 'a' ja 'b' enne funktsiooni nimetamist, kui parameetri väärtus on 20, funktsiooni väärtuses 'i', mis aktsepteerib argumenti väärtust '144' väärtuse 'j' väärtusega, mis aktsepteerib väärtuse väärtust argument "b" 10 "a" ja "b" väärtus pärast funktsiooni kõnet 12 20 

Kõne viite määratlus

Call by Reference meetod läbib funktsiooni koodile argumenti viite / aadressi. Kuna argumenti aadress edastatakse funktsiooni koodile, oleks see aadress aktsepteeriv ametlik parameeter „pointer” muutuja. Nüüd, kui funktsiooni kood on saanud argumenti aadressi, muudab argumenti väärtuse muutmine ka argumenti algväärtust.

C + + ja Java puhul on väga tavaline, et objekt on funktsioonile / meetodile edasi kantud ja objekt on alati selle viitega. Funktsioonis / meetodis objekti sees tehtud muudatused mõjutavad seda funktsiooni / meetodit kasutavat objekti.

Järgnev fragment näitab õiget viisi, kuidas "kõne viitena".

 // näide C ++ klassi vahetusprogrammis {void swap (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = temp; }} int pea {int a = 10, b = 20; cout << "väärtus a, b enne funktsiooni nimetamist" << a << "" < 

Nüüd arutame „kõne viitega”, viies „objekti” argumendina, mis on kaudselt läbitud lähenemise „kõne alusel”.

 klassi kontroll {int a, b; kontroll (int x, int b) {// selle konstantse a = x kaudu vormindatud objekt; b = y; } tühine vahetus (check ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (string args []) {check C = uus kontroll (20, 40); // objekti lähtestamine. system.out.println ("väärtus ob.a" ja "ob.b" enne funktsiooni kõnet "+ ob.a +" "+ ob.b); C. vahetamine (C); // kõne viitena. system.out.println ("väärtus ob.a" ja "ob.b" enne funktsiooni kõnet "+ ob.a +" "+ ob.b); }} // väljundväärtus 'ob.a' ja 'ob.b' enne funktsiooni 20 40 väärtuse 'ob.a' ja 'ob.b' helistamist pärast funktsiooni kõnet 40 20 

Kõne väärtuse ja kõne viite vahelised peamised erinevused

  1. Argumendi edastamine „kõne väärtuse” meetodil läbib ainult selle muutuja koopia, mistõttu selle muutuja koopia väärtuses tehtud muudatused ei mõjuta selle muutuja algset väärtust. Lähenemisviisi puhul kasutatakse muutujatena argumenti, nii et selle muutmine muudab algse muutuja väärtust.
  2. Kui esitatud argumendid on primitiivsed andmesidetüübid, siis nad on lihtsalt "kõne väärtuse järgi", kuid kui argumentide või objektide viited / aadressid on möödas, siis nimetatakse funktsiooni "kõne viitena".
  3. „Kõne väärtuse meetodil” on esitatud argumendid ainult muutujate nimed, samas kui „kõne võrdluses” lähenemisviisil on esitatud argumendid, muutuja nimi piki „&” märki või objekt, mis on möödas just selle nime järgi.
  4. Argumendi parameetrite vastuvõtmine "kõne väärtuse" meetodil on muutuja nimi koos selle andmetüübiga. Lähenemisviisi puhul on vastuvõttev parameeter alati muutuja koos andmetüübiga ja objekti puhul on objekt koos selle klassi tüübiga.

Järeldus:

C ++ ja Java kasutavad mõlemat lähenemist sõltuvalt sellest, mis on möödas. Kui soovite läbida ainult muutuva kasutusvõimaluse väärtuse lähenemise väärtuse ja kui soovid näha muutuja algväärtuse muutust, siis kasutage 'kõne viitega' lähenemist.

Top