it-swarm.com.de

Was kann ich anstelle des Pfeiloperators "->" verwenden?

Was ist der Pfeiloperator (->) ein Synonym für?

101
P-A

Die folgenden zwei Ausdrücke sind äquivalent:

a->b

(*a).b

(vorbehaltlich einer Überladung des Operators, wie Konrad erwähnt, aber das ist ungewöhnlich).

130
Greg Hewgill

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

Vorsicht vor Überladung: Da sowohl -> Als auch * Überladen werden können, kann ihre Bedeutung drastisch variieren.

67
Konrad Rudolph

Die C++ - Sprache definiert den Pfeiloperator (->) als Synonym für die Dereferenzierung eines Zeigers und verwenden Sie dann .- Operator an dieser Adresse.

Beispielsweise:

Wenn Sie ein Objekt haben, anObject, und einen Zeiger, 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 aus:

(*aPointer).method();

Was könnte mit dem Pfeiloperator geschrieben werden:

aPointer->method();

Der Hauptgrund für die Existenz des Pfeiloperators ist, 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 ausführen als:

*(aPointer.method()); // Not our intention!

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

42
P-A

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 ..."

Ich lese es meistens von rechts nach links und rufe "in"

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

wird:

"baz in bar in foo wird in qux quaken."

13
Tetha

-> Wird beim Zugriff auf Daten verwendet, auf die Sie einen Zeiger haben.

Beispielsweise könnten Sie 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()) verstehen, da der Operator Vorrang hat, was nicht das ist, was wir wollen.

Dies ist eigentlich genauso wie das Tippen

ptr->foo();

Da der -> Diesen Zeiger dereferenziert, ruft er die Funktion foo() für die Variable auf, auf die der Zeiger für uns zeigt.

Ebenso können wir mit -> Auf ein Mitglied einer Klasse zugreifen oder dieses festlegen:

myClass* ptr = &myClassMember;
ptr->myClassVar = 2; 
0
Tryb Ghost

Mit -> können Sie eine Funktion definieren.

auto fun() -> int
{
return 100;
}

Es ist kein Lambda. Es ist wirklich eine Funktion. "->" gibt den Rückgabetyp der Funktion an.

0
Zhang