一般的な違いはありますか
(*ptr).method()
対
ptr->method()
この質問を別の質問へのコメントで見たので、ここで質問すると思いました。 C++のほとんどすべての演算子がオーバーロードされる可能性があることを思い出しましたが、答えは異なると思います。しかし、一般的に、一方を行うことと他方を行うことの間に違いはありますか?
「jamesdlin」がすでに述べたように、_*
_および_->
_演算子はクラス型に対してオーバーロードできます。
そして、2つの式_(*ptr).method()
_とptr->method()
は異なる効果を持つことができます。
ただし、built-in演算子の場合、2つの式は同等です。
_->
_は_.
_よりも優先順位が高いため、ポインタのチェーンをたどる場合、_*
_演算子の方が便利です。
検討してください:
_pBook->author->snailMail->Zip
_
versus
_(*(*(*pBook).author).snailMail).Zip
_
生のポインタ型の場合、それらは同等です。
そして、はい、一般的なタイプの場合、クラスはoperator*
およびoperator->
異なる動作をします。
はい。 ptr->method()
は(*ptr).method()
より2文字短い。
また、よりきれいです。
C++標準5.2.5/3:
E1のタイプが「クラスXへのポインター」の場合、式E1-> E2は同等の形式(*(E1))。E2;に変換されます。
非ポインタ値の場合、演算子がオーバーロードされる可能性があります。
しかし、一般的に、一方を行うことと他方を行うことの間に違いはありますか?
番号! (_->
_および_*
_が明示的にオーバーロードされて異なる機能を実行する場合を除く)
ptr->method()
と_(*ptr).method()
_は同等です。
この投稿を掘り下げて申し訳ありませんが、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タイプであるため、この「連鎖」は->
にのみ適用されます。
->
シーケンスは、何かを指していることを示す視覚的なインジケータとして機能します。どちらの演算子も、まったく同じ操作シーケンスを実行します。
それらは同義語です。後者は前者の省略形です。