12

私は C++ ポインタについて学んでいましたが、その->演算子は奇妙に思えました。ptr->hello();それも機能するように見えるので書くことができる代わりに (*ptr).hello();、前者の方が便利な方法だと思いました。

そうですか、違いはありますか?

4

6 に答える 6

35

-> 演算子は、入力する PITA であるため、単なる構文糖衣です。(*ptr).hello()ASM レベルで生成される命令に関しては、違いはありません。実際、いくつかの言語 (D が思い浮かびます) では、コンパイラーが型に基づいてすべてを計算します。コンパイラは ptr がポインターであり、hello() プロパティを持たptr.hello()ないことを認識しているため、(*ptr).hello().

于 2009-01-15T16:49:50.577 に答える
15

他の人は、組み込みポインターに関して既に回答しています。クラスに関しては、operator->()、operator&()、および operator*() をオーバーロードできますが、operator.() はオーバーロードできません。

つまり、呼び出す構文によって、オブジェクトの動作が異なる場合があります。

于 2009-01-15T18:37:03.543 に答える
8

読みやすさの点での主な利点は、関数呼び出しをチェーンする必要がある場合です。つまり、次のようになります。

ptr->getAnotherPtr()->getAThirdPtr()->print()

* 演算子を使用してこれを行うことさえ気にしません。

于 2009-01-15T17:18:05.700 に答える
7

演算子を使用する唯一の理由は、'->'より便利にし、次のようなエラーを回避することです。

*ptr.hello();

括弧を忘れやすいからです。

于 2009-01-15T16:51:32.273 に答える
5

それらはまったく同じマシンコードを生成しますが、私にとっては、ptr->arg() は (*ptr).arg() よりもはるかに読みやすいです。

于 2009-01-15T16:51:21.137 に答える
0

これらの代替構文モードは C から採用されており、A Tutorial on Pointers and Arrays in C、具体的には Chapter 5, Pointers and Structureからさらに理解を深めることができます。

于 2009-01-15T17:02:23.717 に答える