Tarkastellaan vertailukartan avulla joitakin perusrakenteen ja tuhoajan välisiä eroja
Vertailukaavio:
Vertailun perusteet | Rakentaja | destructor |
---|---|---|
Tarkoitus | Se jakaa muistin objektille. | Se jakaa kohteen muistin. |
ilmoitus | luokan_nimi (argumentit, jos sellaisia on) {}; | ~ luokan_nimi (ei argumentteja) {}; |
argumentit | Constructor hyväksyy väitteen | Destructor ei hyväksy mitään väitettä. |
Kutsumus | Rakentajaa kutsutaan automaattisesti, kun kohde luodaan. | Destruktoria kutsutaan automaattisesti, koska lohko poistuu tai ohjelma päättyy. |
Työskentely | Konstruktori sallii objektin alustavan osan arvostaan aikaisemmin, sitä käytetään. | Destructor sallii objektin suorittaa jonkin koodin sen tuhoutumisen aikaan. |
Toteutusjärjestys | Rakentaja kutsutaan peräkkäisessä järjestyksessä. | Destructor kutsutaan käänteisessä järjestyksessä. |
Numeroissa | Luokassa voi olla useita rakentajia. | Mutta luokassa on aina yksi tuhoaja. |
Kopioi rakentaja | Kopioinnin konstruktori sallii rakentajan ilmoittaa ja aloittaa objektin toisesta kohteesta. | Ei tällaista käsitettä. |
Ylikuormitus | Rakentajat voidaan ylikuormittaa. | Destruktoria ei voi ylikuormittaa. |
Rakentajan määritelmä:
Rakentaja on pohjimmiltaan luokan jäsenfunktio, joka alustaa objektin ja jakaa sille muistin. Rakentajat voidaan helposti tunnistaa, koska ne on ilmoitettu ja määritelty samalla nimellä kuin luokassa. Rakentajalla ei ole palautustyyppiä; niin, he eivät palaa mitään, ei edes ”mitätön”. Rakentaja määritellään aina luokan julkisessa osassa.
Luokassa voi olla useita rakentajia; ne voidaan erottaa hyväksyttyjen argumenttien lukumäärän ja tyypin perusteella. Jos luokassa on useita rakentajia; implisiittinen konstruktori (do-nothing-konstruktori) on määriteltävä yhdessä niiden kanssa; se ei tee muuta kuin tyydyttää kääntäjää.
Rakentajat voidaan määritellä myös oletusarvoilla. Vaikka ne myös alustavat objektin "dynaamisesti". Rakentajia ei voi periä, eikä se voi olla virtuaalinen, mutta ne voidaan ylikuormittaa. Niitä ei voida viitata heidän osoitteeseensa.
Rakentajan toteutus:
luokka Const {int a, b; julkinen: Const () {// konstruktori ilman parametria a = 0; b = 0; } Const (int c, int d) {// konstruktori parametrilla a = c; c = d; }}; int main () {Const C1; C2 (10, 20); // tämä lausunto kutsuu rakentajaa}
Kun C1 luodaan, rakentaja, jolla ei ole parametria, suoritetaan, koska C1 ei läpäise mitään parametria. Kun C2 luodaan, suoritetaan konstruktori, jolla on parametri, koska se kulkee kaksi kokonaislukua konstruktorille.
Destructorin määritelmä:
Destructor on myös luokan jäsenfunktio, joka jakaa objektille osoitetun muistin. Se määritellään samalla nimellä kuin luokalla, jota edeltää tilde (~) -symboli. Hävittäjiä kutsutaan aina rakentajien päinvastaisessa järjestyksessä.
Luokassa on aina yksi tuhoaja, koska se ei hyväksy mitään argumentteja. Paikalliset esineet tuhotaan heti, kun suorituksen hallinta sallii lohkon; toisaalta globaalit objektit tuhoutuvat, kun koko ohjelma päättyy. Kääntäjän kutsutaan implisiittisesti tuhoajaksi. Jos luokat periytyvät, ja luokka on johdettu vanhemmasta luokasta, ja sekä lapsiluokassa että vanhemmassa luokassa on tuhoajat; sitten johdetun luokan tuhoaja kutsutaan ensin, jota seuraa vanhemman luokan tuhoaja.
Destruktorin toteutus:
luokka Const {int a, b; julkinen: Const (int c, int d) {// konstruktori parametrilla. a = c; c = d; cout << "arvo a ja b ovat" <Kun luodaan C1-objekti, kehotetaan rakentaja, jolla on kaksi kokonaisluvun tyyppistä parametria, ja jäsen “a, b” alustetaan, kun ”a, b” -arvo tulostetaan. Tämän jälkeen hävittäjä saa kehotuksen ja tulostaa viestin "kohde C1 tuhoutuu".
Rakentajien ja hävittäjien keskeinen ero
- Rakentajan päätarkoitus on kohdistaa muistia objekteille, kun ne luodaan, kun taas tuhoajan pääasiallinen tarkoitus on jakaa kohteen muisti, kun se tuhoutuu.
- Rakentajan sallitaan hyväksyä argumentit, koska argumentteja voidaan käyttää luokan tietojen jäsenten alustamiseen. Hävittäjä ei hyväksy mitään argumentteja, koska sen ainoa tehtävä on kohdistaa kohteen muisti.
- Rakentajaa kutsutaan, kun kohde luodaan. Toisaalta tuhoaja kutsutaan, kun ohjelma lopetetaan tai ohjelma poistuu lohkosta, jossa esine luodaan.
- Rakentajaa käytetään yleensä luokan datan jäsenten alustamiseen, kun taas destruktoria käytetään antamaan objektille jonkin verran toimia ennen kuin se tuhoutuu.
- Rakentajat suoritetaan peräkkäisessä järjestyksessä, mikä tarkoittaa, että jos on johdettu luokka, joka perii perusluokan ja johdetun luokan kohde luodaan, se kutsuu ensin perusluokan rakentajan ja sitten johdetun luokan konstruktorin. Toisaalta johdetun luokan tuhoajaa kutsutaan ensin ja sitten perusluokka tarkoittaa, että destruktori suoritetaan rakentajan käänteisessä järjestyksessä.
- Luokassa voi olla useita konstruktoreita, jotka tunnistetaan hyväksyttyjen numero argumenttien avulla. Luokassa on vain yksi tuhoaja.
- On olemassa kopio-konstruktorin käsite, joka sallii objektin alustamisen toisesta objektista, kun taas tuhoajalla ei ole tällaista käsitettä.
- Rakentajat voivat olla ylikuormituksia suorittamaan erilaisia toimia saman konstruktorin nimissä, kun taas destruktoreita ei voi ylikuormittaa.
johtopäätös:
Samankaltaisuuden lisäksi, että konstruktori ja destruktori ovat luokan erityinen jäsenfunktio, ja niillä on sama nimi, molempien keskinäinen ero on, että "konstruktori" kutsutaan muistin allokointihetkellä ja "destructor" kutsutaan objektien muistin aika. Sekä konstruktori että destruktori kutsutaan kääntäjälle epäsuorasti, vaikka niitä ei ole määritelty luokassa.