Cos'è un distruttore?
Il distruttore è una funzione membro di istanza che viene richiamata automaticamente ogni volta che un oggetto sta per essere distrutto. Ciò significa che un distruttore è l'ultima funzione che verrà chiamata prima che un oggetto venga distrutto.
- Un distruttore è anche una funzione membro speciale come un costruttore. Il distruttore distrugge gli oggetti della classe creati dal costruttore.
- Il distruttore ha lo stesso nome del nome della classe preceduto da un simbolo tilde (~).
- Non è possibile definire più di un distruttore.
- Il distruttore è solo un modo per distruggere l'oggetto creato dal costruttore. Quindi il distruttore non può essere sovraccaricato.
- Il distruttore non richiede alcun argomento né restituisce alcun valore.
- Viene chiamato automaticamente quando un oggetto esce dall'ambito.
- Il distruttore rilascia lo spazio di memoria occupato dagli oggetti creati dal costruttore.
- Nel distruttore, gli oggetti vengono distrutti al contrario della creazione di un oggetto.
La cosa da notare qui se l'oggetto viene creato utilizzando new o il costruttore utilizza new per allocare la memoria che risiede nella memoria heap o nell'archivio libero, il distruttore dovrebbe utilizzare delete per liberare la memoria.
Sintassi
La sintassi per definire il distruttore all'interno della classe:
~ () { // some instructions }> La sintassi per definire il distruttore all'esterno della classe:
:: ~() { // some instructions }> Esempio 1
Il codice seguente dimostra l'esecuzione automatica di costruttori e distruttori quando gli oggetti vengono rispettivamente creati e distrutti.
C++
mappa iterativa Java
// 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;> }> |
>
>Produzione
Constructor executed Destructor executed>
Esempio 2
Il codice seguente dimostra l'esecuzione automatica di costruttori e distruttori ogni volta che vengono creati e distrutti rispettivamente più oggetti.
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;> }> |
>
>Produzione
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
Esempio 3
Il programma C++ seguente dimostra il numero di volte in cui vengono chiamati costruttori e distruttori.
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;> }> |
>
>
Produzione
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>
Nota: Gli oggetti vengono distrutti nell'ordine inverso rispetto alla loro creazione. In questo caso t3 è il primo ad essere distrutto, mentre t è l'ultimo.
Proprietà del distruttore
Di seguito sono riportate le proprietà principali di Destructor:
- La funzione distruttore viene richiamata automaticamente quando gli oggetti vengono distrutti.
- Non può essere dichiarato static o const.
- Il distruttore non ha argomenti.
- Non ha tipo di reso nemmeno void.
- Un oggetto di una classe con un distruttore non può diventare membro dell'unione.
- Un distruttore dovrebbe essere dichiarato nella sezione pubblica della classe.
- Il programmatore non può accedere all'indirizzo del distruttore.
Quando viene chiamato il distruttore?
Una funzione distruttiva viene chiamata automaticamente quando l'oggetto esce dall'ambito:
- la funzione termina
- il programma termina
- termina un blocco contenente variabili locali
- viene chiamato un operatore di cancellazione
Nota: distruttore può anche essere chiamato esplicitamente per un oggetto.
Come chiamare esplicitamente i distruttori?
Possiamo chiamare i distruttori esplicitamente utilizzando la seguente istruzione:
object_name.~class_name()>
In che modo i distruttori differiscono dalle normali funzioni membro?
- I distruttori hanno lo stesso nome della classe preceduto da una tilde (~)
- I distruttori non accettano alcun argomento e non restituiscono nulla
C++
tutorial di Java
#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;> }> |
>
>
Può esserci più di un distruttore in una classe?
No, può esserci un solo distruttore in una classe con un nome di classe preceduto da ~, nessun parametro e nessun tipo restituito.
Quando è necessario scrivere un distruttore definito dall'utente?
Se non scriviamo il nostro distruttore in classe, il compilatore crea per noi un distruttore predefinito. Il distruttore predefinito funziona correttamente a meno che non abbiamo allocato dinamicamente memoria o puntatore in classe. Quando una classe contiene un puntatore alla memoria allocata nella classe, dovremmo scrivere un distruttore per rilasciare memoria prima che l'istanza della classe venga distrutta. Questo deve essere fatto per evitare perdite di memoria.
Un distruttore può essere virtuale?
Sì, in effetti è sempre una buona idea rendere virtuali i distruttori nella classe base quando abbiamo una funzione virtuale. Vedi distruttore virtuale per maggiori dettagli.
Potresti fare un quiz sui distruttori.
articoli Correlati
- Costruttori in C++
- Distruttore virtuale
- Distruttore virtuale puro in C++