アロー演算子 ( ->
) は何の同義語ですか?
7 に答える
次の 2 つの式は同等です。
a->b
(*a).b
(Konradが言及しているように、オペレーターのオーバーロードの影響を受けますが、それは異常です)。
a->b
は一般に の同義語です(*a).b
。ここでの括弧は、演算子のバインディングの強さのために必要であり、*
:.
は バインドがより強く、最初に実行される*a.b
ため機能しません。.
したがって、これは と同等*(a.b)
です。
->
ただし、オーバーロードには注意してください。とはどちら*
もオーバーロードされる可能性があるため、意味が大幅に異なる可能性があります。
C++ 言語では、アロー演算子 ( ->
) をポインターを逆参照するための同義語として定義し、.
そのアドレスで -operator を使用します。
例えば:
オブジェクトanObject
とポインタ がある場合aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
オブジェクト メソッドの 1 つを使用できるようにするには、ポインターを逆参照し、そのアドレスでメソッド呼び出しを行います。
(*aPointer).method();
アロー演算子を使用して次のように記述できます。
aPointer->method();
アロー演算子が存在する主な理由は、非常に一般的なタスクの入力を短縮することと、ポインターの逆参照を囲む括弧を忘れやすいことです。括弧を忘れた場合、.-operator は *-operator よりも強くバインドされ、例を次のように実行します。
*(aPointer.method()); // Not our intention!
他の回答のいくつかは、C++ 演算子がオーバーロードされる可能性があることと、それほど一般的ではないことの両方についても言及しています。
C++0x では、演算子は 2 つ目の意味を持ち、関数またはラムダ式の戻り値の型を示します。
auto f() -> int; // "->" means "returns ..."
私はほとんど右から左に読んで、「in」と呼んでいます
foo->bar->baz = qux->croak
になります:
「foo の bar の baz は qux の croak になります。」