Antworten:
Die folgenden zwei Ausdrücke sind äquivalent:
a->b
(*a).b
(vorbehaltlich einer Überlastung des Bedieners, wie Konrad erwähnt, aber das ist ungewöhnlich).
a[0].banstelle von tun (*a).b. Aber es wäre nicht so richtig strukturiert.
a->bist in der Regel ein Synonym für (*a).b. Die Klammern hier sind aufgrund der Bindungsstärke der Operatoren erforderlich *und .: *a.bwürden nicht funktionieren, da die .Bindung stärker ist und zuerst ausgeführt wird. Dies entspricht also*(a.b) .
Hüten Sie sich vor Überlastung, aber: Da beide ->und *überlastet werden können, kann ihre Bedeutung drastisch unterscheiden.
binding strengthSie meinen Operator Vorrang? Wenn nicht, was ist der Unterschied zwischen den beiden?
Die C ++ - Sprache definiert den Pfeiloperator ( ->) als Synonym für die Dereferenzierung eines Zeigers und verwendet dann die. -operator für diese Adresse.
Beispielsweise:
Wenn Sie ein Objekt anObjectund einen Zeiger haben , aPointer:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
Um eine der Objektmethoden verwenden zu können, dereferenzieren Sie den Zeiger und führen einen Methodenaufruf für diese Adresse durch:
(*aPointer).method();
Was mit dem Pfeiloperator geschrieben werden könnte:
aPointer->method();
Der Hauptgrund für das Vorhandensein des Pfeiloperators besteht darin, dass er die Eingabe einer sehr häufigen Aufgabe verkürzt und die Klammern um die Dereferenzierung des Zeigers leicht vergisst. Wenn Sie die Klammern vergessen haben, bindet der.-Operator stärker als der * -Operator und lässt unser Beispiel wie folgt ausführen:
*(aPointer.method()); // Not our intention!
Einige der anderen Antworten haben auch erwähnt, dass C ++ - Operatoren überladen sein können und dass dies nicht so häufig vorkommt.
new SomeClass()Gibt einen Zeiger ( SomeClass *) zurück, nicht das SomeClassObjekt. Und Sie beginnen mit der Deklaration anObjectund aPointerverwenden sie panschließend.
In C ++ 0x erhält der Operator eine zweite Bedeutung, die den Rückgabetyp einer Funktion oder eines Lambda-Ausdrucks angibt
auto f() -> int; // "->" means "returns ..."
::ist eigentlich ein Operator wie .oder ->und wird im Standard als "Scope Resolution Operator" bezeichnet.
-> wird beim Zugriff auf Daten verwendet, auf die Sie einen Zeiger haben.
Sie können beispielsweise einen Zeiger ptr auf eine Variable vom Typ int intVar wie folgt erstellen:
int* prt = &intVar;
Sie können dann eine Funktion wie foo nur verwenden, indem Sie diesen Zeiger dereferenzieren, um die Funktion für die Variable aufzurufen, auf die der Zeiger zeigt, und nicht für den numerischen Wert des Speicherorts dieser Variablen:
(*ptr).foo();
Ohne die Klammern hier würde der Compiler dies als *(ptr.foo())Folge der Operatorpriorität verstehen, die nicht das ist, was wir wollen.
Dies ist eigentlich genau das gleiche wie Tippen
ptr->foo();
Als ->Dereferenzierung dieses Zeigers ruft er so die Funktion foo()für die Variable auf, auf die der Zeiger für uns zeigt.
Ebenso können wir verwenden, ->um auf ein Mitglied einer Klasse zuzugreifen oder es festzulegen:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->allzu langer Zeit hatten STL-Implementierer für einige Iteratortypen keinen überladenen Operator, sodass Sie ihn verwenden mussten*.. Viele Bibliotheken definieren sie inkonsistent. Wird wirklich nervig, wenn Sie mit Vorlagen arbeiten und den genauen Typ nicht kennen.