|
Objektorientiertes Programmieren mit C++ und JAVA
|
|  
|
11.7 Destruktoren
|  
|
Der Destruktor ist das Gegenstück zu den Konstruktoren. Er tritt jedesmal
in Aktion, wenn der Gültigkeitsbereich eines Objekts verlassen wird.
Außerdem kann er explizit durch delete aufgerufen werden.
Die Datenmember selbst werden automatisch destruiert (durch rekursiven
Aufruf ihrer Destruktoren). Wenn ein Destruktor explizit angegeben ist,
geschieht dies direkt nach der Ausführung seines Rumpfs.
Es ist unumgänglich, mit Destruktoren zu arbeiten, wenn Klassen auf
dynamischen Speicher zugreifen, der z.B. durch den Konstruktor beschafft
wird und durch den Destruktor wieder freigegeben werden kann. In
unserer C++-Version für int-Stacks hatten wir
schon genau solch einen benutzt, der den Speicher der Knoten der intern
geführten Liste freigab.
Weitere Anwendungen sind das Schließen von Dateien bei Datei-Objekten oder
das Entfernen aus globaleren Datenstrukturen etwa zur Buchführung über
die Objekte (Zählen, Verkettung in einer Liste, etc.).
In einer Klasse kann es beliebig viele Konstruktoren, aber nur einen
(parameterlosen) Destruktor geben. Er hat den Prototyp
- ~ classname();
Wenn vom Benutzer kein eigener Destruktor definiert wird, wird vom Compiler
ein Default-Destruktor benutzt, der lediglich die Datenmember destruiert.
Der Destruktor für unsere Vektor-Klasse sieht wie folgt aus:
- class Vector
{
public:
~Vector() { delete[] v; }
// ...
};
Beim Matrix-Destruktor muß zunächst für jeden Zeilenvektor der
Destruktor mit delete aufgerufen werden. Danach wird das Feld
mit den Pointern vernichtet:
- Matrix::~Matrix()
{
for (int i=0;i<rows;++i) delete pv[i];
delete[] pv;
}