T はクラスであり、そのメンバーの 1 つ (ptr) はこのクラスのオブジェクトへのポインターですが、T はポインターのクラスではありません。
ptr
は class のメンバーではありませんT
。クラスのメンバーですauto_ptr<T>
。
ptr
へのポインタT
です。しかし、それT
が「ポインターのクラス」ではないという事実 (それが何を意味するにせよ) は、何かが へのポインターであることを妨げませんT
。
std::string
ポインタではなく、文字列のクラスです。
std::string str;
クラスのオブジェクトですstd::string
。
&str
のアドレスですstr
std::string * ps = &str;
へのポインタstd::string
です。
上から:
template <class T> class auto_ptr
は、唯一のテンプレート パラメータが であるクラス テンプレートですclass T
。実際のクラスを指定し、結果の型のオブジェクトを宣言して、テンプレートをインスタンス化します。T
auto_ptr<std::string> aps;
これにより、次のような別の実際のクラス「auto-pointer-to-string」が得られます。
class auto_ptr_to_string
{
std::string * ptr;
public:
explicit auto_ptr(std::string * p = 0) : ptr(p) {}
~auto_ptr() {delete ptr;}
std::string & operator*() {return *ptr;}
std::string * operator->() {return ptr;}
// ...
};
そしてaps
、そのように定義されたオブジェクトです。
クラスにはptr
、 へのポインタであるデータ メンバがありますstd::string
。
クラスには演算子もあります。
std::string & operator*() {return *ptr;}
auto_ptr<std::string>
この演算子は、タイプのオブジェクトに「*」プレフィックスを適用した結果の動作を定義します*aps
。
演算子の定義は、 への参照を返すことstd::string
、およびstd::string
この参照によって参照されるのは であることを示します。これは
*ptr
、「データ メンバーによって参照されるもの」を意味しますptr
。
そう:
auto_ptr<std::string> aps(new std::string("Get it?"));
auto_ptr<std::string>
呼び出されたものを構築し、コンストラクターは動的に割り当てられた"Get it?" を含むポインターへのポインターを使用しaps
てデータ メンバーを初期化します。aps.ptr
std::string
と:
std::string s = *aps;
の定義に従ってauto_ptr<std::string>::operator*()
、 を宣言し、
によって参照される、つまり「Get it?」を含むものでstd::string
s
それを初期化します。std::string
aps.ptr
最後に、class T
テンプレート パラメーターの構文は、実際にはその値をクラスに制限しません。auto_ptr<int>
たとえば、 はint
クラス タイプではありませんが、問題ありません。auto_ptr
そして、古き良きものであるというマイク・シーモアのコメントを繰り返します。