Soovitatav, 2022

Toimetaja Valik

Konstruktori ja hävitaja vahe

Mõnikord on vaja teatud osa objektist enne selle kasutamist kasutada. Näiteks töötame virna, enne kui me teostame mingeid toiminguid, peab virna ülemine osa olema alati null. See automaatse lähtestamise funktsioon toimub läbi „Konstruktori”. Tõenäoliselt, kui objekt peab enne selle hävitamist mõne koodi täitma. Näiteks kui objekt peab enne selle hävitamist sulgema avatud faili. Seda saab teha „Destructori” abil.

Vaatame võrdlusstruktuuri abil läbi mõned konstruktori ja destruktori vahelised põhilised erinevused

Võrdluskaart:

Võrdluse alusKonstruktorHävitaja
Eesmärk
See eraldab mälu objektile.See jaotab objekti mälu.
Deklaratsioonklassi_nimi (argumendid, kui neid on) {};~ klassi_nimi (pole argumente) {};
ArgumendidKonstruktor aktsepteerib argumentiDestructor ei aktsepteeri ühtegi argumenti.
HelistamineKonstruktorit nimetatakse automaatselt objekti loomisel.Destruktorit kutsutakse automaatselt, kuna plokk väljub või programm lõpeb.
TöötamineKonstruktor lubab objektil enne selle algväärtust ennistada, seda kasutatakse.Destructor võimaldab objekti hävitamise ajal mõnda koodi täita.
Täitmise järjekord
Konstruktorit kutsutakse järjestikku.
Destruktor kutsutakse konstruktori vastupidises järjekorras.
NumbritesKlassis võib olla mitu konstruktorit.Kuid klassis on alati üks hävitaja.
Kopeeri konstruktorKopeerimise konstruktor võimaldab konstruktoril deklareerida ja lähtestada objekti teisest objektist.Sellist mõistet pole.
Üle laadimineKonstruktoreid saab üle koormata.Destruktorit ei saa üle koormata.

Konstruktori mõiste:

Konstruktor on põhiliselt klassi liikmefunktsioon, mis lähtestab objekti ja eraldab sellele mälu. Konstruktorid on kergesti tuvastatavad, kuna need on deklareeritud ja määratletud sama klassi nimega. Konstruktoril ei ole tagasipöördumistüüpi; nii, nad ei tagasta midagi, isegi mitte „tühine”. Konstruktor määratletakse alati klassi avalikus osas.

Klassis võib olla mitu konstruktorit; neid saab eristada sõltuvalt vastuvõetud argumentide arvust ja tüübist. Kui klassis on mitu konstruktorit; koos nendega tuleb määratleda kaudne konstruktor (do-nothing konstruktor); see ei täida midagi, vaid täidab kompilaatorit.

Konstruktoreid saab defineerida ka vaikimisi argumentidega. Samal ajal alustavad nad ka objekti dünaamiliselt. Konstruktoreid ei saa pärida, samuti ei saa see olla virtuaalne, kuid neid saab üle koormata. Neid ei saa nende aadressile viidata.

Konstruktori rakendamine:

 klass Const {int a, b; avalik: Const () {// konstruktor ilma parameetriga a = 0; b = 0; } Const (int c, int d) {// konstruktor parameetriga a = c; c = d; }}; int main () {Const C1; C2 (10, 20); // see avaldus kutsub konstruktorit} 

Kui C1 luuakse konstruktor, kellel ei ole parameetrit, käivitatakse, kuna C1 ei soorita ühtegi parameetrit. Kui C2 luuakse, teostatakse parameetriga konstruktor, kuna see läheb konstruktorile kaks täisarvu.

Hävitaja mõiste:

Destruktor on ka klassi liikmefunktsioon, mis jaotab objektile eraldatud mälu. See on määratletud sama klassi nimega, millele eelneb sümbol tilde (~). Hävitajad kutsutakse alati konstruktorite vastupidises järjekorras.

Klassis on alati üks hävitaja, kuna see ei võta vastu argumente. Kohalikud objektid hävitatakse kohe, kui teostuse kontroll blokeerib; teisest küljest hävitatakse globaalsed objektid kogu programmi lõppemisel. Hävitajat nimetab kaudselt kompilaator. Kui klassid on päritud ja klass on tuletatud vanemaklassist ning nii lapse klassil kui ka vanemaklassil on hävitajad; siis kutsutakse tuletatud klassi hävitajaks kõigepealt, millele järgneb vanema klassi hävitaja.

Hävitaja rakendamine:

 klass Const {int a, b; avalik: Const (int c, int d) {// konstruktor parameetriga. a = c; c = d; cout << "a ja b väärtus on" < 

Kui luuakse C1 objekt, siis kutsutakse üles konstruktor, kellel on kaks täisarvuga parameetrit, ja liige “a, b” alustatakse, kui „a, b” väärtus on trükitud. Pärast seda hävitatakse ja hävitatakse sõnum „objekt C1 hävitatakse”.

Konstruktorite ja hävitajate peamine erinevus

  1. Konstruktori põhieesmärk on eraldada mälu objektidele, kui need on loodud, samal ajal kui hävitaja peamine eesmärk on objekti hävitamine, kui see hävitatakse.
  2. Konstruktoril on lubatud argumente aktsepteerida, sest argumente saab kasutada klassi andmete liikmete initsialiseerimiseks. Hävitaja ei aktsepteeri ühtegi argumenti, kuna tema ainus töö on objekti mälu jaotamine.
  3. Objekti loomisel kutsutakse üles ehitaja. Teisest küljest kutsutakse destruktorit, kui programm lõpetatakse või kui programm väljub plokist, kus objekt on loodud.
  4. Konstruktorit kasutatakse tavaliselt klassi andmete liikmete initsialiseerimiseks, samal ajal kui destruktorit kasutatakse selleks, et võimaldada objektil mõningaid toiminguid enne selle hävitamist.
  5. Konstruktorid teostatakse järjestuses, mis tähendab, et kui on olemas tuletatud klass, mis pärib põhiklassi ja tuletatud klassi objekt luuakse, siis helistab see esimese klassi konstruktorile ja seejärel tuletatud klassi konstruktorile. Teisest küljest nimetatakse tuletatud klassi hävitajaks kõigepealt ja seejärel alusklassi, mis tähendab, et hävitaja teostatakse konstruktori vastupidises järjekorras.
  6. Klassis võib olla mitu konstruktorit, mis on identifitseeritud möödunud numbrite argumentidega. Klassis on ainult üks hävitaja.
  7. On olemas koopia konstruktori mõiste, mis võimaldab objektil lähtestada teisest objektist, samas kui destruktoril puudub selline mõiste.
  8. Konstruktorid võivad olla ülekoormatud, et teha sama konstruktori nime all erinevaid toiminguid, samas kui destruktoreid ei saa ülekoormata.

Järeldus:

Lisaks sarnasusele on see konstruktor ja destruktor klassi eriline liigefunktsioon ja neil on sama nimi, põhiline erinevus nende mõlema vahel on „konstruktor”, mida nimetatakse mälu eraldamise ajal ja „destruktorit” kutsutakse objektide mälu aeg. Nii konstruktor kui ka destruktor kutsutakse kompilaatorile kaudselt, kuigi nad ei ole klassi määratletud.

Top