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.ptrstd::string
と:
std::string s = *aps;
の定義に従ってauto_ptr<std::string>::operator*()、 を宣言し、
によって参照される、つまり「Get it?」を含むものでstd::string sそれを初期化します。std::stringaps.ptr
最後に、class Tテンプレート パラメーターの構文は、実際にはその値をクラスに制限しません。auto_ptr<int>たとえば、 はintクラス タイプではありませんが、問題ありません。auto_ptrそして、古き良きものであるというマイク・シーモアのコメントを繰り返します。