Was ist der Unterschied zwischen dem Punktoperator (.) und -> in C++?
Was ist der Unterschied zwischen dem Punktoperator (.) und -> in C++? [duplicate]
erdig
SwDevMan81
foo->bar()
ist das gleiche wie (*foo).bar()
.
Die obigen Klammern sind wegen der Bindungsstärke des erforderlich *
und .
Betreiber.
*foo.bar()
würde nicht funktionieren, weil Dot (.
)-Operator wird zuerst ausgewertet (vgl Operator Vorrang)
Der Punkt (.
) Operator kann nicht überladen werden, Pfeil (->
)-Operator kann überladen werden.
Der Punkt (.
)-Operator kann nicht auf Zeiger angewendet werden.
Siehe auch: Wofür ist der Pfeiloperator (->) synonym in C++?
-
Beachten Sie, dass dies nur für rohe Zeiger gilt. Für Klassentypen, die den Operator überladen, hat er einige andere interessante Eigenschaften …
– David Rodríguez – Dribeas
17. Juli 2012 um 18:19 Uhr
-
stört es nicht, dass -> ein Drilldown-Operator ist, und daher, wenn er überladen ist, nicht dem Mitglied des dereferenzierten Objekts entspricht (*boo).foo ? als ob boo->foo überladen werden könnte, um ein zwischengeschaltetes Proxy-Objekt zurückzugeben, das ein anderes foo-Element als das in der Ursprungsklasse hat. Würde das nicht behaupten ( (*boo).foo == boo->foo ) fehlschlagen. Es ist wahr, dass man vorsichtig sein sollte, da die C++-Elfen möglicherweise im Dunkeln lauern.
– g24l
19. Januar 2015 um 18:17 Uhr
Gordon Gustafson
Als Zeiger könnten wir einfach verwenden
*pointervariable.foo
Aber die .
-Operator hat Vorrang vor dem *
Betreiber, also .
wird zuerst ausgewertet. Also müssen wir dies mit Klammern erzwingen:
(*pointervariable).foo
Aber es ist schwierig, die () die ganze Zeit zu tippen, also haben sie sich entwickelt ->
als Abkürzung, um dasselbe zu sagen. Wenn Sie auf eine Eigenschaft eines Objekts oder einer Objektreferenz zugreifen, verwenden Sie .
Wenn Sie über einen Zeiger auf eine Eigenschaft eines Objekts zugreifen, verwenden Sie ->
Tadeusz Kopec für die Ukraine
Der Punktoperator kann nicht überladen werden, der Pfeiloperator kann überladen werden. Der Pfeiloperator soll im Allgemeinen auf Zeiger (oder Objekte, die sich wie Zeiger verhalten, wie intelligente Zeiger) angewendet werden. Der Punktoperator kann nicht auf Zeiger angewendet werden.
BEARBEITEN Wenn der Operator auf den Zeigerpfeil angewendet wird, entspricht er der Anwendung des Punktoperators auf Pointee, z ptr->field
ist äquivalent zu (*ptr).field
.
-
Obwohl der Indirektionsoperator (
*foo
) kann überladen werden– Benutzer
23. Februar 2014 um 23:52 Uhr
Der Pfeiloperator ist wie Punkt, außer dass er zuerst einen Zeiger dereferenziert. foo.bar()
ruft Methode auf bar()
auf Objekt foo
, foo->bar
ruft Methode auf bar
auf dem Objekt, auf das der Zeiger zeigt foo
.
Johannes Rudolf
Die .
operator ist für den direkten Mitgliedszugriff.
object.Field
Der Pfeil dereferenziert einen Zeiger, sodass Sie auf das Objekt/den Speicher zugreifen können, auf das er zeigt
pClass->Field
SwDevMan81
pSomething->someMember
ist äquivalent zu
(*pSomething).someMember
espz
Das Ziel. Punkt funktioniert auf Objekten; Pfeil funktioniert mit Zeigern auf Objekte.
std::string str("foo");
std::string * pstr = new std::string("foo");
str.size ();
pstr->size ();