next up previous contents
Next: typedef Up: Zeiger, Zeiger-Feld-Dualität, und Referenzen Previous: Feldvariablenübergabe an Funktionen, dynamische

Referenzen

Eine Referenzvariable etabliert einen zweiten Namen für eine bereits bestehende Variable gleichen Typs. Daher ist klar, daß eine Referenzvariable bei der Deklaration initialisiert werden muß. Danach ändern Zuweisungen nur den den Inhalt der referenzierten Variable, aber nicht die Variable selbst. Viele Compiler implementieren den zugrundeliegenden Mechanismus mit Hilfe von Pointern und wir wollen zwei Programmsegmente, die die gleiche Aufgabe mit Pointern und mit Referenzen erledigen, gegenüberstellen. Es kann jedoch nicht genug betont werden, das Referenzen keine Pointer sind und die jeweilige Implementierung vollständig dem Compilerbauer überlassen ist.

   int  i;                      |   int i;
   int &i_2 = i;                |   int * const i_2 = &i; 
   i_2  = 5;     // i is now 5  |   *i_2 = 5;   
   i = i_2 * i + 5; // i == 30  |   i = (*i_2) * i + 5; 
   std::cout << i_2;            |   std::cout << *i_2;
Man sieht, daß sich eine ähnliche Funktionalität auch mit konstanten Zeigern erreichen läßt, daß aber die Benutzung des ``value of'' Operators * entfällt. Referenzen sind daher einfacher zu verwenden als konstante Zeiger und daher auch weniger fehlerträchtig.

Es ist entscheidend, daß Referenztypen auch von Funktionen (s.d.) zurückgeliefert werden können und damit Funktionen sinnvoll auf der linken Seite von Zuweisungen stehen können.

  int &access( int a[], int i ){ return a[i]; }
   
  void f(){
     int a[20];
     access(a,10) = 5;  // ok, a[10] is 5       
  }
Der Sinn dieses Beipieles wird klarer, wenn man sich vorstellt, daß in access() Bereichsgrenzentests oder ähnliches stattfinden können.

Konstante Referenzen können als Funktionsargumente dienen, wenn die Funktion nur lesend auf die Variable zugreift. In C++ kann die Übergabe als const & häufig das aufwendige Kopieren einer Klassenvariable verhindern und laufzeiteffektiveren Code erzeugen.

Die Übergabe als nichtkonstante Referenz wie die Übergabe von Information per Zeiger verhindert häufig Optimierungen (Stichwort: aliasing von Variablen) und sollte nur dort verwendet werden, wo sie wirklich nötig ist. Auch wird der Compiler nicht ohne Warnung erlauben, temporär erzeugte Variablen, wie die Werte von Ausdrücken oder Zwischenergebnisse einer Rechnung, als nichtkonstante Referenzen an Funktionen zu übergeben.


next up previous contents
Next: typedef Up: Zeiger, Zeiger-Feld-Dualität, und Referenzen Previous: Feldvariablenübergabe an Funktionen, dynamische
© R.Hilfer et al., ICA-1, Univ. Stuttgart
28.6.2002