Referenzen und Konstanten: Referenzen (2/2)
Bei jedem Aufruf des +-Operators wird eine (lokale) Kopie des übergebenen
Objektes (hier eine komplexe Zahl) angelegt, die dann innerhalb der Operatorfunktion
verwendet wird. Eventuelle Änderungen an der Kopie haben damit keinen
Einfluß auf den ursprünglich übergebenen Parameter,
d.h. das übergebene Objekt bleibt uns weiterhin im ursprünglichen
Zustand erhalten.
Das Anlegen einer Kopie kann je nach Größe des verwendeten
Objektes zu einem erheblichen Laufzeitnachteil führen, da jeweils
der Copy-Konstruktor aufgerufen wird, um ein neues Objekt anzulegen.
Beim Verlassen des Gültigkeitsbereichs wird dann der Destruktor aufgerufen, um
das Objekt wieder zu zerstören und den reservierten Speicherbereich wieder freizugeben;
auch dies benötigt Zeit.
Das gleiche gilt für die Übergabe eines Rückgabewertes,
d.h. es wird nicht der erste Operand an sich, sondern eine Kopie davon
zurückgeliefert. Wie unsinnig dieses Vorgehen gerade bei Operatoren,
die wie im Beispiel den ersten Operanden verändern und zurückliefern,
ist, dürfte klar sein: es wird eine Kopie von *this
zurückgeliefert,
obwohl man das Objekt doch eigentlich schon komplett verändert hat.
Man weist dem Ursprungsobjekt eine Kopie seiner selbst zu.
In C++ besteht nun die Möglichkeit, ein Objekt als Referenz
zu deklarieren. Eine Referenz ist dabei ein zweiter Name, der
für ein bereits existierendes Objekt vergeben wird. Zur Deklaration
verwendet man ein zusätzliches &:
complex c1;
complex& c2 = c1; // c2 ist Referenz
(zweiter Name) für c1;
Es handelt sich nun bei der komplexen Zahl c2
nicht um ein neues Objekt
(eine Kopie), sondern nur um eine andere Bezeichnung für
das Objekt c1
.