Wofür ist der Pfeiloperator ( ->
) ein Synonym?
112
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).
->
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.a[0].b
anstelle von tun(*a).b
. Aber es wäre nicht so richtig strukturiert.a->b
ist in der Regel ein Synonym für(*a).b
. Die Klammern hier sind aufgrund der Bindungsstärke der Operatoren erforderlich*
und.
:*a.b
wü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.quelle
binding strength
Sie 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
anObject
und einen Zeiger haben ,aPointer
:Um eine der Objektmethoden verwenden zu können, dereferenzieren Sie den Zeiger und führen einen Methodenaufruf für diese Adresse durch:
Was mit dem Pfeiloperator geschrieben werden könnte:
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:
Einige der anderen Antworten haben auch erwähnt, dass C ++ - Operatoren überladen sein können und dass dies nicht so häufig vorkommt.
quelle
new SomeClass()
Gibt einen Zeiger (SomeClass *
) zurück, nicht dasSomeClass
Objekt. Und Sie beginnen mit der DeklarationanObject
undaPointer
verwenden siep
anschließend.In C ++ 0x erhält der Operator eine zweite Bedeutung, die den Rückgabetyp einer Funktion oder eines Lambda-Ausdrucks angibt
quelle
::
ist eigentlich ein Operator wie.
oder->
und wird im Standard als "Scope Resolution Operator" bezeichnet.Ich lese es meistens von rechts nach links und rufe "in" an.
wird:
"baz in bar in foo wird in qux krächzen."
quelle
->
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:
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:
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
Als
->
Dereferenzierung dieses Zeigers ruft er so die Funktionfoo()
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:quelle
Mit -> können Sie eine Funktion definieren.
Es ist kein Lambda. Es ist wirklich eine Funktion. "->" gibt den Rückgabetyp der Funktion an.
quelle