web-dev-qa-db-ja.com

矢印演算子 `->`の代わりに何を使用できますか?

矢印演算子(->)の同義語?

101
P-A

次の2つの式は同等です。

a->b

(*a).b

(Konradが述べているように、オペレーターのオーバーロードの影響を受けますが、それは異常です)。

130
Greg Hewgill

a->bは通常、(*a).bの同義語です。ここの括弧は、演算子*.の結合強度のために必要です。*a.bはより強力にバインドされ、最初に実行されるため、.は機能しません。したがって、これは*(a.b)と同等です。

ただし、オーバーロードに注意してください:->*の両方がオーバーロードされる可能性があるため、それらの意味は大幅に異なる可能性があります。

67
Konrad Rudolph

C++言語では、矢印演算子(->)ポインタの逆参照の同義語として使用し、.-そのアドレスの演算子。

例えば:

オブジェクトanObjectとポインターaPointerがある場合:

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

オブジェクトメソッドの1つを使用できるようにするには、ポインターを逆参照し、そのアドレスでメソッド呼び出しを実行します。

(*aPointer).method();

これは矢印演算子で書くことができます:

aPointer->method();

矢印演算子が存在する主な理由は、非常に一般的なタスクの入力を短縮し、ポインターの逆参照を囲む括弧を忘れやすいことです。括弧を忘れた場合、.- operatorは* -operatorよりも強くバインドし、サンプルを次のように実行します。

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

他の回答の中には、C++演算子がオーバーロードになる可能性があることと、それほど一般的でないことの両方に言及しているものもあります。

42
P-A

C++ 0xでは、演算子は2番目の意味を取得し、関数またはラムダ式の戻り値の型を示します

auto f() -> int; // "->" means "returns ..."

私はほとんど右から左に読んで「in」を呼び出します

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

になる:

「fooのbarのbazはquxの中で鳴き声になります。」

13
Tetha

_->_は、ポインタを持っているデータにアクセスするときに使用されます。

たとえば、次のようにint intVar型の変数へのポインターptrを作成できます。

_int* prt = &intVar;
_

次に、そのポインターを間接参照することによってのみ、fooなどの関数を使用できます。その変数のメモリ位置の数値ではなく、ポインターが指す変数で関数を呼び出します。

_(*ptr).foo();
_

ここに括弧がなければ、コンパイラはこれを*(ptr.foo())として理解します。これは、演算子の優先順位が望ましいものではないためです。

これは実際にはタイピングと同じです

_ptr->foo();
_

_->_はそのポインターを逆参照するため、ポインターが指している変数に対して関数foo()を呼び出します。

同様に、_->_を使用して、クラスのメンバーにアクセスまたは設定できます。

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

->を使用して関数を定義できます。

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

ラムダではありません。それは本当に機能です。 「->」は、関数の戻り値の型を示します。

0
Zhang