2009-05-10 8 views
1

私はWrapperクラスの.hファイルを見ています。そして、クラスは1つのプライベートメンバが含まれています質問C++の&演算子について

クラスが2つの「*演算子オーバーロード」メソッドを提供し

T* dataPtr; 

(.hファイルの先頭で定義template < class T >のようにどこTです)

T& operator*() 
{ 
    return *dataPtr; 
} 

const T& operator*() const 
{ 
    return *dataPtr; 
} 

どちらも単純に*dataPtrを返しますが、実際には「*dataPtr」という表記が実際に戻っていますか?返品タイプ "T&"とどのように適合していますか?

答えて

6

戻り値の型T &には、Tオブジェクトのインスタンスの参照が返されていると記載されています。 dataPtrはポインタで、*を使用して参照を解除します(ポインタの参照値/インスタンスを取得します)。

2

dataPtrは何かへのポインタです。

*演算子がポインタをデリファレンスするため、* dataPtrはpointie、つまりdataPtrが指しているものを指す(つまり、 'is'の代わりに '参照'または '参照'と言うことができます) 。

T &は、 'タイプがTであるオブジェクトへの参照'(T *とは混同しないでください。 'タイプがTのオブジェクトへのポインタ'を意味します)を意味します。

1

*DataPtrは、DataPtrが指す実際のデータです。両方の演算子はTへの参照を返します。 A 参照は、それが参照する値の別の名前のように考えるべきタイプです。 "フードの下で"、それはポインタに似ていますが、それをそういう考え方ではありません。ポインタの計算や「再配置」はできません。演算子の1つはconstで、constオブジェクトで使用され、もう1つは通常のオブジェクトで使用されます。

1

ラッパークラスはC++ポインターのように動作しているようです。

オペレータ*(dataPtr内に格納されているものと評価される)ラッパーをデリファレンスします。あなたが得るのは、この内容への言及です。例えば。あなたは、定数と非定数バージョンがあるので2つの演算子があります

*intWrapper = 42;

参照に何かを割り当てることができます。定数ラッパークラスを逆参照すると、そのクラスに代入することはできません(const参照(T &)が返されます)