Ein weiterer Konstruktor, der im Zusammenhang mit Zählern sinnvoll ist, ist der Kopierkonstruktor bzw. neudeutsch Copykonstruktor. Er dient dazu, ein Objekt zu kopieren, d.h. ein neues Objekt genau den gleichen Inhalt zu geben wie einem schon vorhandenen. Dabei wird bei der Instanzierung des neuen Objektes das alte als Parameter übergeben. Der Aufruf des Kopierkonstruktors sähe für die Beispielklasse so aus (Klonen von virtuellen Gästen wird strafrechtlich hoffentlich noch nicht verfolgt):
gast neuerGast(alterGast);
Alternativ läßt sich dies natürlich auch mit dem Zuweisungsoperator machen:
gast neuerGast;
neuerGast = alterGast;
Bei dieser Vorgehensweise können aber Probleme auftauchen. Der
Compiler kopiert bei einer Zuweisung mit dem Zuweisungsoperator
standardmäßig das alte Objekt elementweise in das neue
Objekt. Falls dabei Elemente selbst zusammengesetzt sind, entsteht
dabei eine Rekursion. Dabei wird allerdings nicht der Zähler mit
hochgezählt, um dies zu gewährleisten muß man einen
Kopierkonstruktor verwenden (oder die Funktionsweise des
Zuweisungsoperators ändern, doch das erst im Kapitel Operatoren
).
Wie eine Übergabe von Objekten funktioniert lernen wir
allerdings erst im nächsten Kapitel kennen, daher wird der
Kopierkonstruktor erst dort richtig eingeführt. Er wird dort
auch noch eine spezielle Rolle bei der Übergabe von Objekten
spielen.
Dabei erzeugt ein Gleichheitszeichen bei der Deklaration (etwa wie folgt)
gast neuerGast = alterGast;
keinen Aufruf des Zuweisungsoperators, sondern des Kopierkonstruktors. Diese Unterscheidung ist wichtig, wenn man beide Methoden explizit programmiert. Der Zuweisungsoperator wird nur benutzt, wenn das Objekt bereits initialisiert wurde.
Ein weiterer wichtiger Bereich für den Einsatz von Kopierkonstruktoren wird noch im Kapitel Pointer erläutert werden.