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.