Referenzübergabe

Auch eine Übergabe eines Parameters kann mit Hilfe einer Referenz erfolgen, man spricht dabei von einer Referenzübergabe oder nutzt den englischen Terminus call by reference. Eine Referenzübergabe wird ebenfalls durch den Referenzoperator gekennzeichnet, so ist zum Beispiel in der folgenden Deklaration:

  void funktion(int param1, int &param2);

der erste Parameter ein Wertparameter und der zweite ein Referenzparameter, d.h. der erste wird mittels Wert- der zweite mittels Referenzübergabe übergeben.

Um den Unterschied der beiden Übergabemethoden zu verstehen, muß man sich etwas mit der Funktionsweise eines Compilers auseinandersetzen. Der Compiler generiert nämlich bei einer Wertübergabe einen Code, bei dem eine lokale Variable in der Funktion erzeugt wird (sprich: ein Konstruktor für die Klasse wird aufgerufen - mehr dazu weiter hinten in diesem Kapitel), wobei dafür dann Speicher reserviert wird - die Variable ist eine Kopie der übergebenen, Änderungen an ihr wirken sich nicht auf die übergebene Variable aus.

Bei der Referenzübergabe wird aber keine lokale (bzgl. der Funktion) Kopie erzeugt, sondern es wird innerhalb der Funktion nur eine Referenzvariable generiert. Das führt zu wesentlichen Unterschieden:

  1. Alle Änderungen an der Variablen innerhalb der Funktion wirken sich auch auf die übergebene Variable aus.
  2. Es wird gerade soviel zusätzlicher Speicherplatz benötigt, daß auf eine andere Variable verwiesen werden kann, während bei der Wertübergabe eine komplette Variable kopiert wird - was z.B. bei Objekten sehr viel sein kann.
  3. Da nichts kopiert und vor allem kein Konstruktor aufgerufen werden muß, entsteht ein Laufzeitvorteil.
  4. Es können in der einfachen Form keine Konstanten mehr übergeben werden, da diese ja nicht referenziert werden können.