回答:
次の2つの式は同等です。
a->b
(*a).b
(Konradが言及するように、オペレーターのオーバーロードが必要ですが、それは異常です)。
a[0].b
代わりに行うこともできます(*a).b
。しかし、それは適切に構造化されていません。
a->b
通常、の同義語です(*a).b
。ここで括弧のは理由オペレーターの結合強度が必要です*
と.
: *a.b
ので、動作しないでしょう.
バインドが強く、最初に実行されます。したがって、これはと同等*(a.b)
です。
けれども、過負荷に用心:両方以来->
と*
過負荷にすることができ、その意味は大幅に異なる場合があります。
binding strength
、あなたは演算子の優先順位を意味ですか?そうでない場合、2つの違いは何ですか?
C ++言語では、矢印演算子(->
)をポインターの逆参照の同義語として定義し、.
そのアドレスに対して-operatorを使用しています。
例えば:
オブジェクトanObject
、、およびポインタがある場合aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
オブジェクトメソッドの1つを使用できるようにするには、ポインタを逆参照して、そのアドレスに対してメソッド呼び出しを実行します。
(*aPointer).method();
これは矢印演算子で書くことができます:
aPointer->method();
矢印演算子が存在する主な理由は、非常に一般的なタスクの入力を短縮し、ポインタの逆参照の前後の括弧を忘れてしまうこともあるからです。括弧を忘れた場合、.- operatorは* -operatorよりも強くバインドし、この例を次のように実行します。
*(aPointer.method()); // Not our intention!
他の回答のいくつかは、C ++演算子がオーバーロードになる可能性があること、およびそれほど一般的ではないことの両方についても言及しています。
new SomeClass()
オブジェクトSomeClass *
ではなくポインタ()を返しSomeClass
ます。そして、宣言anObject
から始めaPointer
ますが、p
後で使用します。
C ++ 0xでは、演算子は、関数またはラムダ式の戻りの型を示す2番目の意味を取得します
auto f() -> int; // "->" means "returns ..."
::
のように、実際のオペレータである.
か->
、標準で「スコープ解決演算子」と呼ばれています。
->
ポインタを持っているデータにアクセスするときに使用されます。
たとえば、次のように、int intVar型の変数へのポインターptrを作成できます。
int* prt = &intVar;
次に、そのポインターの逆参照だけで、fooなどの関数を使用できます-その変数のメモリ位置の数値ではなく、ポインターが指す変数で関数を呼び出します。
(*ptr).foo();
ここに括弧がないと、コンパイラはこれを次のように理解します。 *(ptr.foo())
、演算子の優先順位が望ましいものではないため、ます。
これは実際にはタイピングと同じです
ptr->foo();
その->
ポインタを逆参照するため、関数を呼び出しますfoo()
と、ポインターが指している変数がれます。
同様に、->
クラスのメンバーにアクセスまたは設定するために使用できます。
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->
、一部のイテレータータイプのオーバーロードされた演算子がなかったため、を使用する必要がありました*.
。多くの図書館はそれらを矛盾して定義しています。テンプレートを使用していて、正確なタイプがわからない場合は、本当に煩わしくなります。