私は C++ ポインタについて学んでいましたが、その->
演算子は奇妙に思えました。ptr->hello();
それも機能するように見えるので書くことができる代わりに
(*ptr).hello();
、前者の方が便利な方法だと思いました。
そうですか、違いはありますか?
私は C++ ポインタについて学んでいましたが、その->
演算子は奇妙に思えました。ptr->hello();
それも機能するように見えるので書くことができる代わりに
(*ptr).hello();
、前者の方が便利な方法だと思いました。
そうですか、違いはありますか?
-> 演算子は、入力する PITA であるため、単なる構文糖衣です。(*ptr).hello()
ASM レベルで生成される命令に関しては、違いはありません。実際、いくつかの言語 (D が思い浮かびます) では、コンパイラーが型に基づいてすべてを計算します。コンパイラは ptr がポインターであり、hello() プロパティを持たptr.hello()
ないことを認識しているため、(*ptr).hello()
.
他の人は、組み込みポインターに関して既に回答しています。クラスに関しては、operator->()、operator&()、および operator*() をオーバーロードできますが、operator.() はオーバーロードできません。
つまり、呼び出す構文によって、オブジェクトの動作が異なる場合があります。
読みやすさの点での主な利点は、関数呼び出しをチェーンする必要がある場合です。つまり、次のようになります。
ptr->getAnotherPtr()->getAThirdPtr()->print()
* 演算子を使用してこれを行うことさえ気にしません。
演算子を使用する唯一の理由は、'->'
より便利にし、次のようなエラーを回避することです。
*ptr.hello();
括弧を忘れやすいからです。
それらはまったく同じマシンコードを生成しますが、私にとっては、ptr->arg() は (*ptr).arg() よりもはるかに読みやすいです。
これらの代替構文モードは C から採用されており、A Tutorial on Pointers and Arrays in C、具体的には Chapter 5, Pointers and Structureからさらに理解を深めることができます。