Dereferenz *
Mittels des Dereferenz-Operators kann auf einen Wert zugegriffen werden, welcher als Pointer vorliegt. Der Stern * steht dabei links des Ausdruckes, der eine Adresse darstellt und zu welchem der Wert angesprochen werden soll.
|
|
Siehe auch Adress-Operator &, Feld-Member-Operator .*, Pointer-Member-Operator .->
Details
Der Dereferenz-Operator erwartet einen Operanden als rvalue und wird von rechts nach links abgearbeitet. Der Rückgabewert ist ein lvalue und hat als Typ eine Referenz & auf den Typ des Operanden ohne den Pointer.
Der Dereferenz-Operator ist das direkte Gegenstück zum Adress-Operator. Während der Adress-Operator zu einem lvalue den Pointer zurückgibt, wandelt der Dereferenz-Operator ebendiesen Pointer wieder zurück in einen lvalue.
Der Dereferenz-Operator wird auch Indirektions-Operator
genannt, beide Begriffe sind etwas verwirrend. Mit Dereferenz ist gemeint, dass ein Pointer nicht einen eigentlichen Wert speichert, sondern nur einen Index (eine Referenz) auf einen lvalue representiert, welcher durch den Dereferenz-Operator dereferenziert, also angesprochen wird. Der Begriff ist verwirrend, da schlussendlich eine Referenz & auf den gesuchten Wert zurückgegeben wird. Mit Indirektion ist gemeint, dass der Pointer nicht der eigentliche Wert, sondern nur eine Umleitung (eine Indirektion) an den Speicherort darstellt. Mittels des Indirektions-Operators kann dieser Wert indirekt angesprochen werden. Auf dieser Seite wird der Name Dereferenz
verwendet.
Der Dereferenz-Operator kann für beliebige Ausdrücke verwendet werden, welche zu einem Pointer auswerten. Dieser Operator funktioniert somit insbesondere für Pointer auf Variablen, aber auch beispielsweise für Pointer auf Elemente von Arrays. Sehr nützlich ist dieser Operator, wenn ein Array sequentiell abgearbeitet werden soll:
|
|
Man beachte hierbei, dass aufgrund der Operatorenrangordnung Klammern nicht nötig sind.
Überladen des Operators
Die semantische Bedeutung des Dereferenz-Operators ist das Ansprechen des Wertes, der durch den gegebenen Operanden referenziert ist. Dies kann beispielsweise für eine Container-Klasse verwendet werden, welche mittels des Dereferenz-Operators Zugriff auf den Inhalt bietet, ihn jedoch in einer für den Programmierer versteckten, komplexen Struktur abspeichert. Auch jegliche andere Semantik wäre denkbar.
Die Prototypen für das Überladen des Dereferenz-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):
|
|
Vorsicht ist geboten bei dem Prototypen ausserhalb der Klasse: Wenn er innerhalb der Klasse steht, wird er von den Compilern nicht als Fehler erkannt, da er einem Prototypen des Multiplikations-Operators entspricht.
Das folgende etwas ausführlichere Beispiel präsentiert eine Klasse für ein Listen-Element. Um die Liste abzuarbeiten, bedient man sich häufig sogenannter Iteratoren. Mittels des überladenen Dereferenz-Operators der Iterator-Klasse kann direkt auf den Inhalt des Listen-Elements zugegriffen werden, ohne sowohl das Listen-Element als auch den Iterator selbst in irgend einer Weise anzusprechen oder die Speicherstruktur zu kennen. Man beachte bei diesem Beispiel, dass der Dereferenz-Operator durch die Überladung nicht auf einen Pointer angewendet wird, sondern auf eine Klasseninstanz.
|
|