2011-08-05 6 views
29

誰かが&(* similarObject)とsimilarObjectの違いは?彼らは同じではありませんか?

dynamic_cast<SomeObject *>(&(*similarObject)); 

私にこれを説明していただけます間接参照ポインタのアドレスをすることのポイントは何ですか?ポインタそのものだけがそのアドレスではないでしょうか?

+7

similarObjectはスマートポインタですか? *このメソッドは、*がオーバーロードされたときに生ポインタの参照を取得するために使用されることがあります。 – DanDan

+0

逆参照とアドレス演算子がおそらくオーバーロードされていますか? –

+3

@ダンダン:答えとしてこれを入れてください。 –

答えて

32

similarObjectのタイプがoperator*にオーバーロードされている可能性があります。したがって、そのアドレスがdynamic_castに渡されているものを返します。

&(*x)およびxは常に同じものです。たとえば、イテレータを考える:

  • itのタイプがあるstd::map<int, int>::iterator
  • &(*it)のタイプはstd::pair<int,int>*

です:

std::map<int, int>::iterator it = v.begin(); 
その後

it&(*it)は、2つの異なるものです彼らはではない。あなたのコードスニペットでも同様のことが起こる可能性があります。

+1

'&v [0]'の代わりに '&* v.begin()'を使用して 'std :: vector'の先頭へのポインタを取得することがあります。 –

+1

@Alexandre:その場合、私は '&v [0]'が分かりやすいので、 '&* v.begin()'よりも好きです。 – Nawaz

+0

私は '&v [0]'を見つけやすくなりましたが、もはやそれはありません。味は時間とともに変化します。 –

17

similarObjectがスマートポインタの場合、このテクニックは、*がオーバーロードされたときに生ポインタの参照を取得するために使用されることがあります。

+2

'auto_ptr'、Boostとtr1スマートポインタはすべてこのための関数を持っています。' .get() ' –

1

similarObjectは左辺値ですが、&*similarObjectは右値です。

+0

'&* similarObject'は右辺値である必要はありません。それは左辺値でもあります。 – Nawaz

+1

@ Nawaz:参照を返すために単項 '&'演算子をオーバーロードする場合のみ。あなたが絶対にしてはならないものです。 – fredoverflow

関連する問題