矢印演算子(->
)の同義語?
次の2つの式は同等です。
a->b
(*a).b
(Konradが述べているように、オペレーターのオーバーロードの影響を受けますが、それは異常です)。
a->b
は通常、(*a).b
の同義語です。ここの括弧は、演算子*
と.
の結合強度のために必要です。*a.b
はより強力にバインドされ、最初に実行されるため、.
は機能しません。したがって、これは*(a.b)
と同等です。
ただし、オーバーロードに注意してください:->
と*
の両方がオーバーロードされる可能性があるため、それらの意味は大幅に異なる可能性があります。
C++言語では、矢印演算子(->
)ポインタの逆参照の同義語として使用し、.
-そのアドレスの演算子。
例えば:
オブジェクト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の中で鳴き声になります。」
_->
_は、ポインタを持っているデータにアクセスするときに使用されます。
たとえば、次のようにint intVar型の変数へのポインターptrを作成できます。
_int* prt = &intVar;
_
次に、そのポインターを間接参照することによってのみ、fooなどの関数を使用できます。その変数のメモリ位置の数値ではなく、ポインターが指す変数で関数を呼び出します。
_(*ptr).foo();
_
ここに括弧がなければ、コンパイラはこれを*(ptr.foo())
として理解します。これは、演算子の優先順位が望ましいものではないためです。
これは実際にはタイピングと同じです
_ptr->foo();
_
_->
_はそのポインターを逆参照するため、ポインターが指している変数に対して関数foo()
を呼び出します。
同様に、_->
_を使用して、クラスのメンバーにアクセスまたは設定できます。
_myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
_
->を使用して関数を定義できます。
auto fun() -> int
{
return 100;
}
ラムダではありません。それは本当に機能です。 「->」は、関数の戻り値の型を示します。