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.