2008-10-21 3 views

Antwort

114

Die folgenden zwei Ausdrücke sind äquivalent:

a->b 

(*a).b 

(vorbehaltlich der Bediener Überlastungen, wie Konrad erwähnt, aber das ist ungewöhnlich).

+9

Überlastung Probleme viel weniger sind ungewöhnlich, als Sie denken angibt. Vor kurzem hatten die STL-Implementierer für einige Iterator-Typen keinen überladenen '->' -Operator, so dass Sie *. * Benutzen mussten. Viele Bibliotheken definieren sie inkonsistent. Wird wirklich ärgerlich, wenn Sie mit Vorlagen arbeiten und nicht den genauen Typ kennen. –

+0

Nach deiner Bearbeitung denke ich, dass dein Beitrag es auf eine gute Weise beschwört. –

+1

können Sie auch 'a [0] tun.b' anstelle von '(* a) .b'. Aber es wäre nicht so strukturiert. –

61

a->b ist allgemein ein Synonym für (*a).b. Die Klammern hier sind notwendig wegen der Bindungsstärke der Operatoren * und .: *a.b würde nicht funktionieren, weil . stärker bindet und zuerst ausgeführt wird. Dies entspricht somit *(a.b).

Vorsicht vor Überlastung: Da sowohl -> als auch * überlastet werden können, kann ihre Bedeutung drastisch abweichen.

13

ich meistens las es von rechts nach links und rufen "in"

foo->bar->baz = qux->croak 

wird:

"baz in bar in foo wird quaken in qux."

35

Die C++ - Sprache definiert den Pfeiloperator (->) als Synonym für Dereferenzierung eines Zeigers und verwendet dann den . -Operator für diese Adresse.

Zum Beispiel:

Wenn Sie eine Aufgabe, anObject und ein Zeiger, aPointer:

SomeClass anObject = new SomeClass(); 
SomeClass *aPointer = &anObject; 

zu können eines der Objekte Methoden der Zeiger dereferenzieren Sie verwenden und tut Methodenaufruf an dieser Adresse:

(*aPointer).method(); 

, die mit dem Pfeil Operator geschrieben werden könnten:

Der Hauptgrund des Vorhandenseins des Pfeiloperators ist, dass es die Eingabe einer sehr häufigen Aufgabe verkürzt und es auch leicht ist, die Klammern um die Dereferenzierung des Zeigers zu vergessen. Wenn Sie die Klammern vergessen haben, die.-Operator stärker binden dann * -Operator und unserem Beispiel machen ausführen wie:

*(aPointer.method()); // Not our intention! 

einige der anderen Antwort haben auch beide erwähnen, dass C++ Operatoren Überlastung sein kann und dass es nicht das ist üblich.

+8

'new SomeClass()' gibt einen Zeiger ('SomeClass *') zurück, nicht das 'SomeClass' Objekt. Und Sie beginnen damit, 'anObject' und' aPointer' zu deklarieren, aber Sie verwenden danach 'p'. – musiphil

+0

insgesamt ist diese Erklärung theoretisch sehr passend, nur die Veränderung von Objekten macht es etwas verworren. Aber der Prozess ist besser beschrieben –

14

In C++ 0x, erhält der Betreiber eine zweite Bedeutung, den Rückgabetyp einer Funktion oder Lambda-Ausdruck

auto f() -> int; // "->" means "returns ..." 
+1

Technisch spuckt es ist nicht mehr ein "Operator" da, oder ist es? –

+4

@Martin meisten Menschen verwenden das Wort "Operator" für viele Dinge, die nicht direkt für die Berechnung von Werten verwendet werden. Wie für "::" ("scope operator"). Ich weiß nicht, was der Standpunkt des Standards genau hier ist. In einem abstrakten Sinne könnte man "->" als einen funktionalen Operator betrachten, der eine Folge von Typen (Parametern) einem Rückgabetyp zuordnet, wie der Haskell-Operator, der auch "->" geschrieben wird. –

+3

Ich gebe auf! :-P –

Verwandte Themen