Auch wenn sich Objekte als Wertparameter übergeben lassen -
genauso wie in C++ ja auch die Standardtypen als Objekte aufgefaßt
werden können
- so sind doch einige spezielle
Dinge zu beachten, wenn man Objekte mit speziellen Konstruktoren und
Destruktoren übergibt, da diese bei einer Wertübergabe
implizit aufgerufen werden.
Bei der Übergabe als Wertparameter erzeugt der Compiler ja eine lokale Kopie des übergebenen Wertes. Dazu wird der eben besprochene Kopierkonstuktor aufgerufen. Dies kann oft nicht wünschenswert sein, da Ressourcen verschwendet werden (falls der Kopierkonstruktor komplex ist) oder Nebeneffekte auftreten können (z.B. neue Gäste gezählt werden). Ein besonderer Fall, wo eine Wertübergabe kritisch wäre, ist die Übergabe eines Objektes an den Kopierkonstruktor. Würde diese Übergabe per Wert erfolgen, würde ja bei dem Aufruf wieder der Kopierkonstruktor aufgerufen, für diesen Aufruf wieder und so fort. Es würde eine unendliche Rekursion erzeugt.
Das bei der Wertübergabe erzeugte Objekt wird wie andere
lokale Objekte am Ende der Funktion gelöscht, indem der
zugehörige Destruktor aufgerufen wird. Auch das kann zu
unerwünschten Wirkungen führen, falls der Destruktor mehr
macht, als nur das Objekt aufzuräumen. Beispiele für solche
Probleme im Umgang mit Kopierkonstruktoren und Destruktoren findet
man im Kapitel Pointer
.
Im allgemeinen ist es daher sinnvoll, Objekte als (konstante) Referenz zu übergeben. Ausnahmen bilden dabei sehr kleine und wenig komplexe Objekte und zum anderen Situationen, in denen ein Objekt geändert werden soll, um z.B. als Rückgabewert genutzt zu werden - dazu mehr in den Beispielen am Ende des Kapitels.