C++ Tutorial

 Konstruktor & Destruktor

Konstruktor

Definition

Der Konstruktor, auch als ctor bezeichnet, ist eine spezielle Memberfunktion, die zur Initialisierung der Eigenschaften einer Klasse dient und folgende Besonderheiten aufweist:

  • Er wird automatisch bei der Definition eines Objekts aufgerufen,
  • der Funktionsname ist identisch mit dem Klassennamen und
  • er hat keinen Rückgabewert (auch nicht void!)

Da der Konstruktor bei der Definition eines Objekts aufgerufen wird, ist nun nicht mehr die erste Anweisung in der main() Funktion zwingend auch die erste auszuführende Anweisung. Sehen Sie sich folgendes Beispiel und die daraus resultierenden Ausgaben an:

#include <iostream>
#include <format>

// Klasse mit einem Konstruktor, ohne Destruktor
class Object
{
public:
   // ctor
   Object()
   {
      std::cout << "Object ctor\n";
   }
   // dtor
   // Implementierung folgt gleich
};

// Globales Objekt
Object globalObj;

int main()
{
   std::cout << "Eintritt in main()\n";
   // Lokales Objekt
   Object localObj;
   std::cout << "Verlassen von main()\n";
}

Parameter und Initialisiererliste

Sollen Objekte mit unterschiedlichen Daten initialisiert werden, werden diese Daten per Parameter an den Konstruktor übergeben. Bei der Objektdefinition werden die Daten nach dem Objektnamen in einer runden oder geschweiften Klammer aufgelistet.

Im Konstruktor erfolgt die Initialisierung der Eigenschaften entweder per Zuweisung und/oder über eine Initialisiererliste. Die Initialisiererliste steht nach der Parameterklammer des Konstruktors und wird mit einem Doppelpunkt eingeleitet. Nach dem Doppelpunkt folgt anschließend eine Liste mit den zu initialisierenden Eigenschaften. Die Initialwerte für die Eigenschaften stehen jeweils nach dem Eigenschaftsnamen in einer Klammer.

#include <iostream>
#include <format>
#include <string>

// Unvollstaendige Klasse mit einem Konstruktor
// da Destruktor noch fehlt
class Object
{
   int number;         // beliebiges Datum
   std::string title;  // std::string ist ein Objekt!
public:
   // ctor
   // Eigenschaften per Initialisiererliste initalisieren
   // da std::string ein Objekt Standard-Lib ist!
   Object(int num, std::string_view tit): number(num), title(tit)
   {
      std::cout << std::format("{}. Object ctor: {}\n",number,title);
   }
   // dtor
   // Implementierung folgt gleich
};

// Globales Objekt, Initialdaten per Parameter
Object globalObj(1,"Globales Objekt");

int main()
{
   std::cout << "Eintritt in main()\n";
   // Lokales Objekt
   Object localObj(2,"Lokales Objekt");
   std::cout << "Verlassen von main()\n";
}

Destruktor

Definition

Der Destruktor, auch dtor genannt, ist ebenfalls eine spezielle Memberfunktion, die zum Aufräumen der von einem Objekt belegten Ressourcen dient und besitzt folgende Besonderheiten:

  • Er wird automatisch beim Löschen eines Objekts aufgerufen,
  • der Funktionsname ist ebenfalls identisch mit dem Klassennamen, jedoch steht vor dem Funktionsnamen eine Tilde ~ und
  • auch er besitzt keinen Rückgabewert.

Da der Destruktor beim Löschen eines Objekts automatisch aufgerufen wird, besitzt er keine Parameter.

#include <iostream>
#include <format>
#include <string>

// Vollstaendige Klasse mit ctor und dtor
class Object
{
   int number;          // beliebiges Datum
   std::string title;   // std::string ist ein Objekt!
public:
   // ctor
   // Eigenschaften per Initialisiererliste initalisieren
   // da std::string ein Objekt Standard-Lib ist!
   Object(int num, std::string_view tit): number(num), title(tit)
   {
      std::cout << std::format("{}. Object ctor: {}\n",number,title);
   }
   // dtor
   ~Object()
   {
      std::cout << std::format("Objekt {} geloescht\n",number);
   }
};

// Globales Objekt, Initialdaten per Parameter
Object globalObj(1,"Globales Objekt");

int main()
{
   std::cout << "Eintritt in main()\n";
   // Beginn eines Blocks
   {
      // Lokales Objekt
      // Lebensdauer endet am Blockende!
      Object localObj(2,"Lokales Objekt");
   } // Fuehrt dtor des lokalen Objekts aus
   std::cout << "Verlassen von main()\n";
}