Einführung in Konstruktoren und Destruktoren

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Konstruktoren und Destruktoren - Index

Einige spezielle Member-Funktionen bestimmen, wie die Objekte einer Klasse erzeugt, initialisiert, kopiert und gelöscht werden. Konstruktoren und Destruktoren sind die wichtigsten dieser Funktionen. Sie verfügen über viele Eigenschaften der normalen Member-Funktionen. Beispielsweise werden sie innerhalb einer Klasse deklariert und definiert oder innerhalb einer Klasse deklariert und außerhalb definiert. Sie haben allerdings noch einige besondere Eigenschaften:

  • Sie haben keine Rückgabewert-Deklaration (auch nicht void).
  • Sie können nicht vererbt werden, allerdings kann eine abgeleitete Klasse die Konstruktoren und Destruktoren der Basisklasse aufrufen.
  • Konstruktoren können — wie die meisten C++ Funktionen — Parameterlisten mit Vorgabewerten haben oder die Initialisierungslisten der Member benutzen.
  • Destruktoren können virtual sein, Konstruktoren nicht. (Siehe Virtuelle Destruktoren.)
  • Ihre Adressen können nicht übernommen werden.
int main(void)
{
.
.
.
void *ptr = base::base;    // ungültig
.
.
.
}
  • Konstruktoren und Destruktoren können vom Compiler generiert werden, wenn sie nicht explizit vom Benutzer definiert wurden. Sie werden außerdem bei vielen Gelegenheiten im Programm aufgerufen, ohne dass im Quelltext ein expliziter Aufruf steht. Jeder Konstruktor oder Destruktor, der vom Compiler generiert wird, ist public.
  • Konstruktoren können nicht wie eine normale Funktion aufgerufen werden. Dagegen ist der Aufruf von Destruktoren möglich, wenn ihr vollständig qualifizierter Name verwendet wird.
{
.
.
.
X *p;
.
.
.
p–>X::~X();                // legaler Aufruf des Destruktors
X::X();                    // illegaler Aufruf des Destruktors
.
.
.
}
  • Bei der Definition bzw. dem Löschen von Objekten ruft der Compiler automatisch Konstruktoren und Destruktoren auf.
  • Konstruktoren und Destruktoren können implizit die Operatoren new und delete aufrufen, wenn eine Speicherplatzreservierung für ein Objekt nötig ist.
  • Ein Objekt, das einen Konstruktor oder Destruktor enthält, kann nicht als Member einer Variante verwendet werden.
  • Wenn für eine Klasse X kein Konstruktor zur Aufnahme eines gegebenen Typs definiert wurde, wird nicht versucht, andere Konstruktoren oder Konvertierungsfunktionen zu finden, um den zugewiesenen Wert in einen Typ umzuwandeln, der von einem Konstruktor für Klasse X akzeptiert wird. Beachten Sie, dass diese Regel nur für Konstruktoren mit einem Parameter gilt, und wenn keine Initialisierer mit der Syntax "=" verwendet werden.
class X { /* ... */ X(int); };
class Y { /* ... */ Y(X); };
Y a = 1;                   // ungültig: Y(X(1)) nicht versucht

Hat class X einen oder mehrere Konstruktoren, wird bei jeder Definition eines Objekts vom Typ class X einer davon aufgerufen. Der Konstruktor erzeugt x und initialisiert es. Destruktoren machen diesen Vorgang wieder rückgängig, indem sie das von den Konstruktoren erzeugte Objekt der Klasse löschen.

Konstruktoren werden auch bei der Erzeugung eines lokalen oder temporären Objekts einer Klasse aufgerufen. Destruktoren werden aufgerufen, wenn der Gültigkeitsbereich der Klasse verlassen wird.

Siehe auch