Was ist der Pfeiloperator (->
) ein Synonym für?Was kann ich anstelle des Pfeiloperators `->` verwenden?
Antwort
Die folgenden zwei Ausdrücke sind äquivalent:
a->b
(*a).b
(vorbehaltlich der Bediener Überlastungen, wie Konrad erwähnt, aber das ist ungewöhnlich).
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.
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."
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.
'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
insgesamt ist diese Erklärung theoretisch sehr passend, nur die Veränderung von Objekten macht es etwas verworren. Aber der Prozess ist besser beschrieben –
In C++ 0x, erhält der Betreiber eine zweite Bedeutung, den Rückgabetyp einer Funktion oder Lambda-Ausdruck
auto f() -> int; // "->" means "returns ..."
Technisch spuckt es ist nicht mehr ein "Operator" da, oder ist es? –
@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. –
Ich gebe auf! :-P –
- 1. Was kann ich anstelle von eval() verwenden?
- 2. Was kann ich anstelle von char.to_i verwenden?
- 3. Was sollte ich anstelle des veralteten UISegmentedControlStyleBezeile in iOS5.1 verwenden?
- 4. Was soll ich anstelle von as.real verwenden?
- 5. Was sollte ich anstelle von isinstance() verwenden
- 6. Was soll ich anstelle von `qt5_use_modules` verwenden?
- 7. Was soll ich anstelle von sscanf verwenden?
- 8. Was anstelle von org.jboss.resteasy.client.ClientRequest verwenden?
- 9. Kann ich SafeHandle anstelle von IntPtr verwenden?
- 10. Wann sollte ich String.Format oder String.Concat anstelle des Verkettungsoperators verwenden?
- 11. Was anstelle von polymorphen Assoziationen zu verwenden?
- 12. Welche Klasse sollte ich anstelle des veralteten AmazonCloudFrontClient verwenden?
- 13. Warum var anstelle des Klassennamens verwenden?
- 14. Was sollte ich anstelle von Syncdb in Django 1.9 verwenden?
- 15. Was soll ich anstelle von printf in Perl verwenden?
- 16. Kann ich '> =' für NSComparisonResult verwenden?
- 17. JSGF-Grammatik anstelle des DMP-Sprachmodells verwenden (-jsgf anstelle von -lm verwenden) in CMU Sphinx (pocketsphinx)
- 18. Kann ich CoffeeScript anstelle von JS für node.js verwenden?
- 19. Kann ich diese Erweiterungsmethode konvertieren, um IDbSet <> anstelle von DbContext zu verwenden?
- 20. Kann ich anstelle von <text> ein PNG als Maske für diese Wasseranimation verwenden?
- 21. Warum kann nicht nur ich verwenden Eventhandler <int> anstelle von EventArgs
- 22. Kann ich anstelle des klassischen Ereigniserhöhungsmusters einen Operator mit null Bedingungen verwenden?
- 23. Wie kann ich den Hostnamen des Servers anstelle von localhost mit JBoss verwenden?
- 24. Kann ich eine benutzerdefinierte Form anstelle des Standardrahmens in einer TextBox verwenden?
- 25. In Azure API Management kann ich den Subskriptionsschlüssel als Teil der Anforderungsheader anstelle des Abfragezeichenfolgenparameters verwenden?
- 26. Doctrine2 Migration Verwenden von DBAL anstelle von $ this-> addSql
- 27. Git, kann ich es anstelle von Sourcesafe oder Subversion verwenden?
- 28. Welche Methode kann ich anstelle von __file__ in Python verwenden?
- 29. Wie kann ich einen Funktionszeiger anstelle einer Schalteranweisung verwenden?
- 30. Kann ich Javascript Closures anstelle einer globalen Variable verwenden?
Ü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. –
Nach deiner Bearbeitung denke ich, dass dein Beitrag es auf eine gute Weise beschwört. –
können Sie auch 'a [0] tun.b' anstelle von '(* a) .b'. Aber es wäre nicht so strukturiert. –