Priporočena, 2024

Izbira Urednika

Razlika med konstruktorjem in uničevalcem

Včasih je potrebno inicializirati del predmeta, preden ga lahko uporabimo. Na primer, delamo na stacku, preden izvedemo kakšno dejanje, mora biti vrh stack vedno nastavljen na nič. Ta funkcija samodejne inicializacije se izvede preko 'Konstruktor'. Verjetno, če mora objekt izvesti neko kodo, preden jo uniči. Na primer, če mora objekt pred zapiranjem zapreti datoteko, ki jo je odprl. Izvede se lahko s pomočjo 'Destructor'.

Oglejmo si nekaj osnovnih razlik med konstruktorjem in destruktorjem s pomočjo primerjalne tabele

Primerjalna tabela:

Podlaga za primerjavoKonstruktorUničevalec
Namen
Pomnilnik dodeli predmetu.Sprejema spomin na predmet.
Deklaracijaclass_name (argumenti, če obstajajo) {};~ class_name (brez argumentov) {};
ArgumentiKonstruktor sprejme argumentDestructor ne sprejme nobenega argumenta.
KlicanjeKonstruktor se imenuje samodejno, ko je predmet ustvarjen.Destructor se imenuje samodejno, saj je blokiran ali se program konča.
DeloKonstruktor dovoljuje predmetu inicializirati nekaj vrednosti pred, se uporablja.Destructor omogoča predmetu, da izvrši neko kodo v času njegovega uničenja.
Vrstni red izvršitve
Konstruktor se kliče zaporedoma.
Destruktor se imenuje v obratnem vrstnem redu konstruktorja.
V številkahV razredu je lahko več konstruktorjev.Vendar je v razredu vedno en sam destruktor.
Kopiraj konstruktorjaKonstruktor kopiranja omogoča konstruktorju razglasitev in inicializacijo objekta iz drugega objekta.Takšnega koncepta ni.
PreobremenitevKonstruktorji so lahko preobremenjeni.Destruktorja ni mogoče preobremeniti.

Opredelitev graditelja:

Konstruktor je v bistvu članska funkcija razreda, ki inicializira objekt in mu dodeli pomnilnik. Konstruktorje je mogoče enostavno identificirati, ker so deklarirani in definirani z istim imenom kot razred. Konstruktor nima povratnega tipa; zato ne vrnejo ničesar, niti ne "prazne". Konstruktor je vedno definiran v javnem razdelku razreda.

V razredu lahko obstaja več konstruktorjev; Razlikujemo jih lahko glede na število in vrsto posredovanih argumentov. Če v razredu obstaja več konstruktorjev; skupaj z njimi mora biti definiran implicitni konstruktor (konstruktor ne-nič); ne dela ničesar, ampak zadovolji prevajalnik.

Konstruktorje lahko definirate tudi s privzetimi argumenti. Medtem ko predmet tudi inicializirajo »dinamično«. Konstruktorji ne morejo biti podedovani, niti ne morejo biti virtualni, lahko pa so preobremenjeni. Ne morejo se nanašati na njihov naslov.

Izvajanje konstruktorja:

 razred Const {int a, b; public: Const () {// konstruktor brez parametra a = 0; b = 0; } Const (int c, int d) {// konstruktor s parametrom a = c; c = d; }}; int main () {Const C1; C2 (10, 20); // ta stavek pokliče konstruktorja} 

Ko je C1 ustvarjen, se izvede konstruktor brez parametra, saj C1 ne prenese nobenega parametra. Medtem, ko se ustvari C2, se konstruktor s parametrom izvede, saj konstruktorju posreduje dva cela števila.

Opredelitev uničevalca:

Destructor je tudi članska funkcija razreda, ki odstrani pomnilnik, dodeljen predmetu. Opredeljen je z istim imenom kot razred, pred katerim je simbol tilda (~). Destruktorji se vedno imenujejo v obratnem vrstnem redu konstruktorjev.

V razredu je vedno en sam destructor, ker ne sprejema nobenih argumentov. Lokalni objekti se uničijo takoj, ko nadzor nad izvršitvijo zapusti blok; po drugi strani pa se globalni objekti uničijo, ko se konča celoten program. Prevajalnik implicitno imenuje destruktor. Če so razredi podedovani, in razred je izpeljan iz nadrejenega razreda in sta tako otroški razred kot nadrejeni razred imela destruktorje; potem se najprej pokliče destruktor izpeljanega razreda, ki mu sledi destruktor nadrejenega razreda.

Izvajanje uničilca:

 razred Const {int a, b; public: Const (int c, int d) {// konstruktor s parametrom. a = c; c = d; cout << "vrednost a in b sta" < 

Ko je ustvarjen objekt C1, se prikliče konstruktor z dvema parametroma celoštevilskega tipa, član "a, b" pa se inicializira in natisne vrednost "a, b". Po tem, ko se prikliče destructor in natisne sporočilo »objekt C1 se uniči«.

Ključna razlika med konstruktorji in destruktorji

  1. Glavni namen konstruktorja je, da dodeli pomnilnik objektom, ko so ustvarjeni, medtem ko je glavni namen destruktorja, da razdeli pomnilnik objekta, ko je uničen.
  2. Konstruktorju je dovoljeno sprejeti argumente, saj se lahko argumenti uporabijo za inicializacijo podatkovnih članov razreda. Destructor ne sprejema nobenih argumentov, saj je njegovo delo samo, da razreši pomnilnik objekta.
  3. Konstruktor se kliče, ko je objekt ustvarjen. Po drugi strani pa se po prekinitvi programa ali preklicu bloka, v katerem je bil ustvarjen objekt, pokliče destruktor.
  4. Konstruktor se ponavadi uporablja za inicializacijo podatkovnih članov razreda, medtem ko se destructor uporablja, da naj objekt izvede neko dejanje, preden se uniči.
  5. Konstruktorji se izvajajo v zaporednem zaporedju, kar pomeni, da če obstaja izpeljani razred, ki podeduje osnovni razred in je ustvarjen objekt izpeljanega razreda, potem najprej pokliče konstruktor osnovnega razreda in nato konstruktor izpeljanega razreda. Po drugi strani pa se najprej imenuje destruktor izpeljanega razreda, nato pa osnovni razred pomeni, da se destruktor izvrši v obratnem vrstnem redu konstruktorja.
  6. V razredu lahko obstaja več konstruktorjev, ki so identificirani s posredovanimi argumenti. V razredu je samo en destruktor.
  7. Obstaja koncept konstruktorja kopij, ki omogoča, da se objekt inicializira iz drugega objekta, medtem ko destruktor nima takega koncepta.
  8. Konstruktorji se lahko preobremenijo za izvedbo različnih dejanj pod imenom istega konstruktorja, medtem ko destruktorji ne morejo biti preobremenjeni.

Sklep:

Poleg podobnosti je konstruktor in destruktor posebna funkcija člana razreda in imata isto ime, osnovna razlika med obema je, da je 'konstruktor' klican v času dodelitve pomnilnika in 'destructor' se imenuje na \ t čas razreševanja spomina objektov. Oba, konstruktor in destructor sta implicitno imenovana s strani prevajalnika, čeprav nista definirana v razredu.

Top