logo

Destruktoren in C++

Was ist ein Destruktor?

Der Destruktor ist eine Instanzmitgliedsfunktion, die automatisch aufgerufen wird, wenn ein Objekt zerstört werden soll. Das heißt, ein Destruktor ist die letzte Funktion, die aufgerufen wird, bevor ein Objekt zerstört wird.

  • Ein Destruktor ist ebenfalls eine spezielle Memberfunktion wie ein Konstruktor. Der Destruktor zerstört die vom Konstruktor erstellten Klassenobjekte.
  • Der Destruktor hat den gleichen Namen wie sein Klassenname, dem ein Tilde-Symbol (~) vorangestellt ist.
  • Es ist nicht möglich, mehr als einen Destruktor zu definieren.
  • Der Destruktor ist nur eine Möglichkeit, das vom Konstruktor erstellte Objekt zu zerstören. Daher kann der Destruktor nicht überlastet werden.
  • Der Destruktor erfordert weder ein Argument noch gibt er einen Wert zurück.
  • Es wird automatisch aufgerufen, wenn ein Objekt den Gültigkeitsbereich verlässt.
  • Der Destruktor gibt den Speicherplatz frei, der von den vom Konstruktor erstellten Objekten belegt wird.
  • Im Destruktor werden Objekte in umgekehrter Reihenfolge wie bei der Objekterstellung zerstört.

Hier ist Folgendes zu beachten: Wenn das Objekt mithilfe von „new“ erstellt wird oder der Konstruktor „new“ verwendet, um Speicher zuzuweisen, der sich im Heap-Speicher oder im freien Speicher befindet, sollte der Destruktor „delete“ verwenden, um den Speicher freizugeben.

Syntax

Die Syntax zum Definieren des Destruktors innerhalb der Klasse:

~ () { // some instructions }>

Die Syntax zum Definieren des Destruktors außerhalb der Klasse:

 :: ~() { // some instructions }>

Beispiel 1

Der folgende Code demonstriert die automatische Ausführung von Konstruktoren und Destruktoren, wenn Objekte erstellt bzw. zerstört werden.

C++

was bedeutet das xd




// 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;> }>

>

>

Ausgabe

 Constructor executed Destructor executed>

Beispiel 2

Der folgende Code demonstriert die automatische Ausführung von Konstruktoren und Destruktoren jedes Mal, wenn mehrere Objekte erstellt bzw. zerstört werden.

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;> }>

>

>

Ausgabe

 Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>

Beispiel 3

Das folgende C++-Programm zeigt, wie oft Konstruktoren und Destruktoren aufgerufen werden.

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;> }>

>

>

Ausgabe

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>

Notiz: Objekte werden in umgekehrter Reihenfolge ihrer Entstehung zerstört. In diesem Fall wird t3 als erstes zerstört, während t als letztes zerstört wird.

Eigenschaften des Destruktors

Im Folgenden sind die Haupteigenschaften von Destructor aufgeführt:

  • Die Destruktorfunktion wird automatisch aufgerufen, wenn die Objekte zerstört werden.
  • Es kann nicht als statisch oder konstant deklariert werden.
  • Der Destruktor hat keine Argumente.
  • Es gibt keinen Rückgabetyp, nicht einmal void.
  • Ein Objekt einer Klasse mit einem Destruktor kann kein Mitglied der Union werden.
  • Ein Destruktor sollte im öffentlichen Abschnitt der Klasse deklariert werden.
  • Der Programmierer kann nicht auf die Adresse des Destruktors zugreifen.

Wann wird der Destruktor aufgerufen?

Eine Destruktorfunktion wird automatisch aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt:

  1. Die Funktion endet
  2. Das Programm endet
  3. ein Block mit lokalen Variablen endet
  4. Es wird ein Löschoperator aufgerufen

Notiz: Zerstörer kann auch explizit für ein Objekt aufgerufen werden.

Wie rufe ich Destruktoren explizit auf?

Wir können die Destruktoren explizit mit der folgenden Anweisung aufrufen:

object_name.~class_name()>

Wie unterscheiden sich Destruktoren von normalen Memberfunktionen?

  • Destruktoren haben denselben Namen wie die Klasse, dem eine Tilde (~) vorangestellt ist.
  • Destruktoren akzeptieren kein Argument und geben nichts zurück

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;> }>

>

Konvertieren Sie einen String in int Java
>

Kann es mehr als einen Destruktor in einer Klasse geben?

Nein, es kann nur einen Destruktor in einer Klasse mit einem Klassennamen mit vorangestelltem ~, ohne Parameter und ohne Rückgabetyp geben.

Wann müssen wir einen benutzerdefinierten Destruktor schreiben?

Wenn wir in der Klasse keinen eigenen Destruktor schreiben, erstellt der Compiler einen Standarddestruktor für uns. Der Standarddestruktor funktioniert einwandfrei, es sei denn, wir haben in der Klasse dynamisch Speicher oder Zeiger zugewiesen. Wenn eine Klasse einen Zeiger auf den in der Klasse zugewiesenen Speicher enthält, sollten wir einen Destruktor schreiben, um Speicher freizugeben, bevor die Klasseninstanz zerstört wird. Dies muss erfolgen, um Speicherlecks zu vermeiden.

Kann ein Destruktor virtuell sein?

Ja, tatsächlich ist es immer eine gute Idee, Destruktoren in der Basisklasse virtuell zu machen, wenn wir eine virtuelle Funktion haben. Weitere Informationen finden Sie unter Virtueller Destruktor.

Vielleicht möchten Sie an einem Quiz über Destruktoren teilnehmen.

In Verbindung stehende Artikel