138 Stimmen

Was kann ich statt des Pfeiloperators `->` verwenden?

Wofür steht der Pfeiloperator (->) als Synonym?

183voto

Greg Hewgill Punkte 882617

Die folgenden beiden Ausdrücke sind äquivalent:

a->b

(*a).b

(unter der Voraussetzung der Operatorüberladung, wie Konrad erwähnt, aber das ist ungewöhnlich).

11 Stimmen

Überlastungsprobleme sind viel weniger ungewöhnlich als man denkt. Noch vor kurzem hatten STL-Implementierer keinen überladenen ->-Operator für einige Iteratortypen, also mussten Sie *. verwenden. Viele Bibliotheken definieren sie inkonsistent. Wird wirklich ärgerlich, wenn Sie mit Vorlagen arbeiten und den genauen Typ nicht kennen.

2 Stimmen

Du kannst auch a[0].b anstelle von (*a).b machen. Aber es wäre nicht so gut strukturiert.

6 Stimmen

Junge, nach vielen Jahren C#-Programmierung ist es nicht nur kognitiv anstrengend, zu C++ zurückzugehen, die C++-Syntax ist einfach hässlich und eklig. Ich fühle mich, als müsste ich mich duschen, nachdem ich es benutzt habe. Programme, die in C und C++ geschrieben sind, fördern nur schlechtes Programmieren. Apple, vor Unix, kämpfte darum, die Sprache so hübsch wie Pascal zu machen.

74voto

Konrad Rudolph Punkte 503837

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

Aber Vorsicht vor Überladung: Da sowohl -> als auch * überladen werden können, kann ihre Bedeutung drastisch unterschiedlich sein.

3 Stimmen

Mit Bindungsstärke meinen Sie die Operatorpräzedenz? Wenn nicht, was ist der Unterschied zwischen den beiden?

3 Stimmen

@Vizkrig Ja, die beiden Begriffe werden austauschbar verwendet (obwohl "Operatorpräzedenz" in den letzten Jahren häufiger zu sein scheint).

47voto

P-A Punkte 10242

Die C++-Sprache definiert den Pfeiloperator (->) als Synonym für die Dereferenzierung eines Zeigers und anschließende Verwendung des .-Operators an dieser Adresse.

Zum Beispiel:

Wenn Sie ein Objekt, anObject, und einen Zeiger, aPointer, haben:

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

Um eine der Methoden des Objekts verwenden zu können, dereferenzieren Sie den Zeiger und führen einen Methodenaufruf an dieser Adresse durch:

(*aPointer).methode();

Was mit dem Pfeiloperator geschrieben werden könnte:

aPointer->methode();

Der Hauptgrund für das Vorhandensein des Pfeiloperators besteht darin, dass er das Tippen 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, wird der .-Operator stärker als der *-Operator gebunden und führt unser Beispiel wie folgt aus:

*(aPointer.methode()); // Nicht beabsichtigt!

Einige der anderen Antworten haben auch erwähnt, dass C++-Operatoren überladen werden können und dass dies nicht so häufig vorkommt.

8 Stimmen

new SomeClass() gibt einen Zeiger (SomeClass *) zurück, nicht das SomeClass Objekt. Und du fängst damit an, anObject und aPointer zu deklarieren, aber du benutzt danach p.

0 Stimmen

Insgesamt ist diese Erklärung theoretisch sehr passend, nur die Änderung der Objekte macht sie etwas kompliziert. Aber der Prozess ist besser beschrieben

19voto

In C++0x bekommt der Operator eine zweite Bedeutung, die den Rückgabetyp einer Funktion oder Lambda-Ausdrucks angibt

auto f() -> int; // "->" bedeutet "gibt zurück ..."

1 Stimmen

Technisch gesehen ist es dort nicht mehr ein "Operator", oder doch?

6 Stimmen

@Martin die meisten Leute verwenden das Wort "Operator" für viele Dinge, die nicht direkt zur Berechnung von Werten verwendet werden. Wie zum Beispiel für "::" ("Bereichsoperator"). Ich weiß nicht, was der Standard dazu genau sagt. In einem abstrakten Sinne könnte man "->" als einen funktionalen Operator betrachten, der eine Sequenz von Typen (Parametern) auf einen Rückgabetyp abbildet, ähnlich dem Haskell-Operator, der auch "->" geschrieben wird.

2 Stimmen

@JohannesSchaub-litb: :: ist tatsächlich ein Operator, wie . oder ->, und wird im Standard "Bereichsauflösungsoperator" genannt.

13voto

Tetha Punkte 4750

Ich lese es meistens von rechts nach links und nenne es "im"

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

wird zu:

"baz in bar in foo wird zu croak in qux."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X