Bei der Deklaration einer Variablen vom Typ Person
muss der
Compiler Speicherplatz bereitstellen und diesen geeignet
initialisieren. Dazu wird im Falle einer Klasse immer ein
sogenannter Konstruktor aufgerufen. Konstruktoren sind
spezielle Elementfunktionen, die als Namen den Klassennamen selbst
tragen und keine Rückgabetyp, auch nicht void
festlegen.
Wir können beliebig viele Konstruktoren definieren, die sich
allerdings, wie für überladene Funktionen typisch, im ihren Argumenten
unterscheiden müssen. Ihre Aufgabe ist immer die Herstellung eines
konsistenten Zustandes der Instanz durch Initialisierung von
Variablen, insbesondere die Initialisierung von Konstanten im
Klassenkörper, die Anforderung von Resourcen wie Speicher, das Öffnen einer
Datei oder Netzwerkverbindung, usw. Eine besondere Rolle spielt der
Defaultkonstruktor, dem kein Argument übergeben wird. Er wird, falls
vom Benutzer kein anderer Konstruktor definiert ist,
implizit vom Compiler bereitgestellt und seine Existenz ist für die
Initialisierung von Feldern einer Klassenvariable notwendig.
class Person{ public: Person(); // user defined default constructor (ctor) //... };
Analog zum Konstruktor einer Klasse gibt es einen Destruktor, der
nötigenfalls angeforderte Resourcen wieder freigibt. Dieser trägt
als Name den Klassennamen mit einem vorangestellten ~
.
Person.h: //Dateiname class Person { public: Person(Datum birthday, string name); // Konstruktor Person(const Person &); // Kopierkonstruktor ~Person(); // Destruktor int age; // z.b. in Tagen von Referenzdatum gerechnet std::string name; // C++ standard library Klasse }; Person.cc: //Dateiname // Programmcode zum constructor (ctor) Person::Person(Datum birthday, string a_name) { name = a_name age = current_date() - birthday; } Person::Person(const Person &rhs) // Programmcode zum copy constructor { name = rhs.name; age = rhs.age } Person::~Person(){} // destructor (dtor)
So wie der Konstruktor dafür sorgt, dass Konstruktoren für alle Klassenbestandteile in der Reihenfolge ihres Auftretens in der Klassendeklaration aufgerufen werden, so sorgt der Destruktor für einen entsprechenden Aufruf der Destruktoren der Klassenbestandteile in umgekehrter Reihenfolge. Wie im Falle des Defaultkonstruktors wird vom Compiler ein Destruktor bereitgestellt, falls vom Benutzer keiner definiert wird. Es gibt nur einen Destruktor, der argumentlos und ohne Rückgabetyp deklariert werden muss.