Übergabe als konstante Referenz

Da eine Übergabe als Referenz Laufzeitvorteile bringt, nämlich zum einen in der Geschwindigkeit und zum anderen im Speicherverbrauch, kann es wünschenswert sein, einen Parameter als Referenz zu übergeben, auch wenn man ihn nicht ändern will. Dazu gibt es die Möglichkeit einer Übergabe als konstante Referenz. Sie wird mit dem Schlüsselwort const gekennzeichnet, z.B.:

  void funktion2(const int &param);

Ein derart übergebener Parameter darf in der Funktion nicht verändert werden - Versuche es doch zu tun führen zu Compilerfehler. Gegenüber einer Wertübergabe hat diese Form den Vorteil, daß man die auf der vorherigen Seite beschriebenen Laufzeitverbesserungen bekommt. Gegenüber der Referenzübergabe ergibt sich der Vorteil, daß der Compiler weiß, daß ein Parameter nicht geändert werden darf - er kann zum einen kontrollieren, daß das nicht vorkommt, zum anderen ist damit auch wieder die Übergabe von Konstanten erlaubt.

Die Übergabe als konstante Referenz als Ersatz für eine Wertübergabe macht dann Sinn, wenn es nicht wünschenswert ist, eine lokale Instanz der Parameterklasse zu erzeugen. Dies ist vor allem dann der Fall, wenn ein Konstruktoraufruf zuviel Zeit oder Speicher benötigt, d.h. bei Klassen, die sehr groß oder sehr komplex sind. Aber auch Nebenwirkungen von Konstruktoren und Destruktoren (zum Aufruf von Destruktoren siehe weiter hinten in diesem Kapitel) können unerwünscht sein, so würde bei der Beispielklasse aus dem vorherigen Kapitel ja bei jeder Wertübergabe ein neuer Gast begrüßt.

Die Wertübergabe ist dann von Vorteil, wenn man in der Funktion den übergebenen Wert verändern möchte, ohne daß dieser sich außerhalb der Funktion mit ändert. Bei einer Übergabe als konstante Referenz müßte man dann ja eine zusätzliche lokale Variable einführen - damit würden alle Vorteile der Referenzübergabe zunichte gemacht. Im Falle von einfachen Datentypen ist es egal, ob lokal eine Referenz oder ein Wert erzeugt wird, der Unterschied zwischen einem int und einem int& macht sich hier nicht bemerkbar.