5. Referenzen

HW06B :: C++

Go down

5. Referenzen

Post  Admin on Sat May 05, 2007 1:29 pm

Die Sprache C kennt bei Funktionen nur die Wertübergabe. Soll ein Unterprogramm eine Variable x des Hauptprogramms verändern, muss ihm die Adresse &x
in Form eines Zeigers übergeben werden, und das Unterprogramm muss den
Zeiger bei jedem Zugriff dereferenzieren. Dass dies zu
Programmierfehlern geradezu einlädt, haben Sie im Kapitel Zeiger gesehen. C++ hat deshalb den Sprachumfang um Referenzen
erweitert. In technischer Hinsicht sind Referenzen nichts anderes als
Zeiger auf Variablen. Es gibt aber einige wesentliche Unterschiede:

  • eine Referenz muss initialisiert werden,
  • die Adresse, auf die eine Referenz zeigt, kann nicht verändert werden,
  • Referenzen werden mit der gleichen Syntax eingesetzt wie „echte“ Variablen,
  • es gibt kein Analogon zum Nullzeiger.
Code:
int  a = 1;  // eine Variable
int &r = a;  // Referenz auf die Variable
int *p = &a; // Zeiger auf die Variable

std::cout << "a: " << a << " r: " << r << " p: " << *p << std::endl;
a++;
std::cout << "a: " << a << " r: " << r << " p: " << *p << std::endl;

Anwendung


Referenzen werden hauptsächlich verwendet, um Argumente an Funktionen zu übergeben (call-by-reference). Gegenüber der Wertübergabe hat das zwei Vorteile:

  • die übergebenen Variablen können verändert werden,
  • das Kopieren der Argumente als Wert entfällt, so dass Zeit und Speicherplatz gespart werden.

Gegenüber der Verwendung von Zeigern ist neben der einfacheren
Syntax der Hauptvorteil, dass die Existenz der übergebenen Variable
garantiert ist. Ein Zeiger könnte dagegen nirgendwohin oder auf einen
bereits wieder freigegebenen Speicherbereich zeigen. Diese Fehler
können vom Compiler nicht erkannt werden und machen sich erst zur
Laufzeit unangenehm bemerkbar.

Code:

int fn(int &n)
{
std::cout << "n: " << n << std::endl;
}
int a = 1;
fn(a);

Wo das Referenzierungszeichen (&) steht bleibt dem Benutzer
überlassen. Alle folgenden Zeilen haben also die selbe Bedeutung:

Code:
int fn(int &n)
int fn(int & n)
int fn(int& n)
int fn(int&n)

Es ist aber üblich, das Referenzierungszeichen neben der zu referenzierten Variable stehen zu haben.
Eine Referenz darf nur mit einer existierenden Variablen
initialisiert werden (genauer: mit einem L-Wert). Im Beispiel geht
folgendes nicht:

Code:
fn(1); // unmöglich! 1 ist keine Variable

Wenn aber, wie es in unserem Beispiel der Fall ist, die als Referenz
übergebene Variable überhaupt nicht verändert werden muss, kann sie als
const deklariert werden:

[code]int gn(const int &n)
{
std::cout << "n: " << n << std::endl;
}Dann ist der Aufruf

[code]gn(1);[/code]

völlig legal; der Compiler wird eine temporäre int-Variable mit dem Wert 1 initialisieren und diese der Funktion gn übergeben.

Bei Zeiger und Referenzen werde ich keine praxisbeispiele hinzufügen, weil euch das nur verwirren würde.
avatar
Admin
Rang : Administrator

Number of posts : 141
Age : 27
Registration date : 2007-03-16

View user profile

Back to top Go down

Back to top


HW06B :: C++

 
Permissions in this forum:
You cannot reply to topics in this forum