web-dev-qa-db-ja.com

ポインター逆参照演算子((*)vs->)

一般的な違いはありますか

(*ptr).method()

ptr->method()

この質問を別の質問へのコメントで見たので、ここで質問すると思いました。 C++のほとんどすべての演算子がオーバーロードされる可能性があることを思い出しましたが、答えは異なると思います。しかし、一般的に、一方を行うことと他方を行うことの間に違いはありますか?

34
Falmarri

「jamesdlin」がすでに述べたように、_*_および_->_演算子はクラス型に対してオーバーロードできます。

そして、2つの式_(*ptr).method()_とptr->method()は異なる効果を持つことができます。

ただし、built-in演算子の場合、2つの式は同等です。

_->_は_._よりも優先順位が高いため、ポインタのチェーンをたどる場合、_*_演算子の方が便利です。

検討してください:

_pBook->author->snailMail->Zip
_

versus

_(*(*(*pBook).author).snailMail).Zip
_
62

生のポインタ型の場合、それらは同等です。

そして、はい、一般的なタイプの場合、クラスはoperator*およびoperator->異なる動作をします。

12
jamesdlin

はい。 ptr->method()(*ptr).method()より2文字短い。

また、よりきれいです。

10
wrongusername

C++標準5.2.5/3:

E1のタイプが「クラスXへのポインター」の場合、式E1-> E2は同等の形式(*(E1))。E2;に変換されます。

非ポインタ値の場合、演算子がオーバーロードされる可能性があります。

しかし、一般的に、一方を行うことと他方を行うことの間に違いはありますか?

番号! (_->_および_*_が明示的にオーバーロードされて異なる機能を実行する場合を除く)

ptr->method()と_(*ptr).method()_は同等です。

5
Prasoon Saurav

この投稿を掘り下げて申し訳ありませんが、OPの式は未加工のポインタ型と同等ですが、C++で述べられているすべてのほかに、少なくとも1つの重要な違いがあると思います。

ウィキペディアから( http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6 ):

Operator->()の戻り型は、ポインター型など、->操作を適用できる型である必要があります。 xがC型で、Cがoperator->()をオーバーロードする場合、x-> yはx.operator->()-> yに展開されます。

これは、->dereferenceableタイプを返すことが期待されているのに対し、*dereferencedタイプであるため、この「連鎖」は->にのみ適用されます。

2
Jonathan H

->シーケンスは、何かを指していることを示す視覚的なインジケータとして機能します。どちらの演算子も、まったく同じ操作シーケンスを実行します。

1
AK.

それらは同義語です。後者は前者の省略形です。

0
Alex Budovski