Kas yra destruktorius?
Destruktorius yra egzemplioriaus nario funkcija, kuri automatiškai iškviečiama, kai objektas bus sunaikintas. Reiškia, naikintojas yra paskutinė funkcija, kuri bus iškviesta prieš sunaikinant objektą.
- Destruktorius taip pat yra speciali nario funkcija, tokia kaip konstruktorius. Destruktorius sunaikina konstruktoriaus sukurtus klasės objektus.
- Destructor turi tokį patį pavadinimą kaip ir jų klasės pavadinimas, prieš kurį rašomas tildės (~) simbolis.
- Neįmanoma apibrėžti daugiau nei vieno destruktoriaus.
- Destruktorius yra tik vienas iš būdų sunaikinti konstruktoriaus sukurtą objektą. Taigi naikintojas negali būti perkrautas.
- Destructor nereikalauja jokių argumentų ir nepateikia jokios reikšmės.
- Jis automatiškai iškviečiamas, kai objektas išeina iš taikymo srities.
- Destruktorius atlaisvina atminties erdvę, kurią užima konstruktoriaus sukurti objektai.
- Destruktoriuje objektai naikinami atvirkščiai, nei sukuriamas objektas.
Čia reikia pažymėti, kad jei objektas sukurtas naudojant naują arba konstruktorius naudoja naują, kad paskirstytų atmintį, esančią krūvos atmintyje arba laisvoje saugykloje, naikintojas turėtų naudoti trynimą, kad atlaisvintų atmintį.
Sintaksė
Sintaksė, skirta apibrėžti destruktorių klasėje:
~ () { // some instructions }> Sintaksė, skirta apibrėžti destruktorius už klasės ribų:
:: ~() { // some instructions }> 1 pavyzdys
Žemiau pateiktas kodas parodo automatinį konstruktorių ir naikintojų vykdymą, kai objektai sukuriami ir sunaikinami.
C++
kokie mėnesiai yra Q1
// C++ program to demonstrate the execution of constructor> // and destructor> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>'
Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Išvestis
Constructor executed Destructor executed>
2 pavyzdys
Žemiau pateiktas kodas parodo automatinį konstruktorių ir naikintojų vykdymą kiekvieną kartą, kai sukuriami ir sunaikinami keli objektai.
C++
// C++ program to demonstrate the execution of constructor> // and destructor when multiple objects are created> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>'
Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >// Create multiple objects of the Test class> >Test t, t1, t2, t3;> >return> 0;> }> |
>
>Išvestis
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
3 pavyzdys
Žemiau pateikta C++ programa parodo, kiek kartų iškviečiami konstruktoriai ir destruktoriai.
C++
// C++ program to demonstrate the number of times> // constructor and destructors are called> #include> using> namespace> std;> static> int> Count = 0;>//It is static so that every class object has the same value> class> Test {> public>:> >// User-Defined Constructor> >Test()> >{> >// Number of times constructor is called> >Count++;> >cout <<>'No. of Object created: '> << Count> ><< endl;> >}> >// User-Defined Destructor> >~Test()> >{> > >cout <<>'No. of Object destroyed: '> << Count>//It will print count in> ><< endl;>//decending order> >Count--;> >// Number of times destructor is called> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }> |
>
>
Išvestis
No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>
Pastaba: Objektai naikinami atvirkštine jų sukūrimo tvarka. Šiuo atveju t3 yra pirmasis, kuris sunaikinamas, o t yra paskutinis.
Destruktoriaus savybės
Toliau pateikiamos pagrindinės „Destructor“ savybės:
- Destruktoriaus funkcija automatiškai iškviečiama, kai objektai sunaikinami.
- Jis negali būti paskelbtas statiniu ar pastoviu.
- Destruktorius neturi argumentų.
- Jis neturi grąžinimo tipo, net negaliojančio.
- Klasės su Destruktoriumi objektas negali tapti sąjungos nariu.
- Naikintojas turėtų būti paskelbtas viešoje klasės dalyje.
- Programuotojas negali pasiekti naikintojo adreso.
Kada iškviečiamas naikintojas?
Destruktoriaus funkcija iškviečiama automatiškai, kai objektas išeina iš taikymo srities:
kas yra modulo c++
- funkcija baigiasi
- programa baigiasi
- blokas su vietiniais kintamaisiais baigiasi
- iškviečiamas trynimo operatorius
Pastaba: naikintojas taip pat gali būti aiškiai vadinamas objektu.
Kaip aiškiai pavadinti naikintojus?
Destruktorius galime aiškiai iškviesti naudodami šį teiginį:
object_name.~class_name()>
Kuo destruktoriai skiriasi nuo įprastų narių funkcijų?
- Destruktoriai turi tą patį pavadinimą kaip ir klasė, prieš kurią rašoma tildė (~)
- Destruktoriai nepriima jokių argumentų ir nieko negrąžina
C++
#include> using> namespace> std;> class> String {> private>:> >char>* s;> >int> size;> public>:> >String(>char>*);>// constructor> >~String();>// destructor> };> String::String(>char>* c)> {> >size =>strlen>(c);> >s =>new> char>[size + 1];> >strcpy>(s, c);> }> String::~String() {>delete>[] s; }> int> main()> {> >String str =>'Hello, World!'>;> >String myString(str);> >cout <<>'String: '> << myString.s << endl;> >return> 0;> }> |
>
>
Ar klasėje gali būti daugiau nei vienas naikintojas?
Ne, klasėje gali būti tik vienas naikintuvas su klasės pavadinimu, prieš kurį rašoma ~, be parametrų ir be grąžinimo tipo.
Kada mums reikia parašyti vartotojo apibrėžtą naikintuvą?
Jei klasėje neparašome savo destruktoriaus, kompiliatorius sukuria mums numatytąjį naikintuvą. Numatytasis naikintuvas veikia gerai, nebent klasėje dinamiškai paskirstome atmintį arba žymeklį. Kai klasėje yra žymeklis į klasėje paskirtą atmintį, turėtume parašyti naikintuvą, kuris atlaisvintų atmintį prieš sunaikinant klasės egzempliorių. Tai turi būti padaryta siekiant išvengti atminties nutekėjimo.
Ar destruktorius gali būti virtualus?
Taip, Tiesą sakant, visada yra gera idėja padaryti naikintuvus virtualius bazinėje klasėje, kai turime virtualią funkciją. Norėdami gauti daugiau informacijos, žr. virtualų naikintuvą.
Galbūt norėsite atlikti viktoriną apie naikintojus.
susiję straipsniai
- Konstruktoriai C++
- Virtualus naikintojas
- Grynas virtualus destruktorius C++