Ce este un destructor?
Destructorul este o funcție membru al instanței care este invocată automat ori de câte ori un obiect urmează să fie distrus. Adică, un destructor este ultima funcție care va fi apelată înainte ca un obiect să fie distrus.
- Un destructor este, de asemenea, o funcție membru specială ca un constructor. Destructor distruge obiectele de clasă create de constructor.
- Destructorul are același nume cu numele clasei lor precedat de un simbol tilde (~).
- Nu este posibil să definiți mai mult de un destructor.
- Destructorul este doar o modalitate de a distruge obiectul creat de constructor. Prin urmare, destructorul nu poate fi supraîncărcat.
- Destructorul nu necesită nici un argument și nici nu returnează nicio valoare.
- Este apelat automat atunci când un obiect iese din domeniul de aplicare.
- Destructor eliberează spațiul de memorie ocupat de obiectele create de constructor.
- În destructor, obiectele sunt distruse în reversul creării unui obiect.
Lucrul este de remarcat aici dacă obiectul este creat folosind new sau constructorul folosește new pentru a aloca memorie care se află în memoria heap sau în depozitul liber, destructorul ar trebui să folosească delete pentru a elibera memoria.
Sintaxă
Sintaxa pentru definirea destructorului în cadrul clasei:
~ () { // some instructions }> Sintaxa pentru definirea destructorului în afara clasei:
:: ~() { // some instructions }> Exemplul 1
Codul de mai jos demonstrează execuția automată a constructorilor și a destructorilor atunci când obiectele sunt create și, respectiv, distruse.
C++
traversarea post-comandă
// 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;> }> |
>
>Ieșire
Constructor executed Destructor executed>
Exemplul 2
Codul de mai jos demonstrează execuția automată a constructorilor și a destructorilor de fiecare dată când sunt create și, respectiv, distruse mai multe obiecte.
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;> }> |
>
>Ieșire
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
Exemplul 3
Programul C++ de mai jos demonstrează de câte ori sunt apelați constructorii și destructorii.
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;> }> |
>
>
Ieșire
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>
Notă: Obiectele sunt distruse în ordinea inversă creării lor. În acest caz, t3 este primul care este distrus, în timp ce t este ultimul.
Proprietățile Destructorului
Următoarele sunt principalele proprietăți ale Destructorului:
- Funcția destructor este invocată automat când obiectele sunt distruse.
- Nu poate fi declarat static sau const.
- Destructorul nu are argumente.
- Nu are niciun tip de returnare, nici măcar nul.
- Un obiect al unei clase cu un Destructor nu poate deveni membru al uniunii.
- Un destructor trebuie declarat în secțiunea publică a clasei.
- Programatorul nu poate accesa adresa destructorului.
Când este numit destructorul?
O funcție de distrugere este apelată automat atunci când obiectul iese din domeniul de aplicare:
- funcția se încheie
- programul se termină
- se termină un bloc care conține variabile locale
- este apelat un operator de ștergere
Notă: distrugător poate fi de asemenea apelat explicit pentru un obiect.
lista de matrice java
Cum să chemați destructorii în mod explicit?
Putem apela destructorii în mod explicit folosind următoarea declarație:
object_name.~class_name()>
Prin ce diferă destructorii de funcțiile membre normale?
- Destructorii au același nume ca și clasa precedată de un tilde (~)
- Destructorii nu acceptă niciun argument și nu returnează nimic
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;> }> |
>
>
Poate fi mai mult de un destructor într-o clasă?
Nu, poate exista un singur destructor într-o clasă cu un nume de clasă precedat de ~, fără parametri și fără tip de returnare.
Când trebuie să scriem un destructor definit de utilizator?
Dacă nu scriem propriul nostru destructor în clasă, compilatorul creează un destructor implicit pentru noi. Destructorul implicit funcționează bine, cu excepția cazului în care am alocat dinamic memorie sau pointer în clasă. Când o clasă conține un pointer către memorie alocat în clasă, ar trebui să scriem un destructor pentru a elibera memoria înainte ca instanța clasei să fie distrusă. Acest lucru trebuie făcut pentru a evita scurgerile de memorie.
Poate un destructor să fie virtual?
Da, de fapt, este întotdeauna o idee bună să facem destructori virtuali în clasa de bază atunci când avem o funcție virtuală. Consultați destructorul virtual pentru mai multe detalii.
V-ar putea dori să susțineți un test despre distrugători.
Articole similare
- Constructori în C++
- Distrugător virtual
- Pur destructor virtual în C++