1

次のコードを理解しようとします(ここから取得):

template <class T> class auto_ptr
{
    T* ptr;
public:
    explicit auto_ptr(T* p = 0) : ptr(p) {}
    ~auto_ptr()                 {delete ptr;}
    T& operator*()              {return *ptr;} // <----- The problematic row.
    T* operator->()             {return ptr;}
    // ...
};

T&関数の戻り値の型として使用するときの意味がわかりません。Tが整数 (またはその他の型) へのポインターである場合、整数 (T&またはその他の対応する型) として解釈します。しかし、上記のコードTではポインタではありません。Tはクラスであり、そのメンバーの 1 つ ( ptr) はこのクラスのオブジェクトへのポインターですが、ポインターTのクラスではありません。T&では、戻り値の型としては何を意味するのでしょうか?

4

3 に答える 3

3

T&これは、関数の戻り値の型のコンテキスト外、つまり への参照と同じことを意味しTます。この場合、関数はT、呼び出し元が参照されたオブジェクトを観察する (修飾されTていない場合は変更する) ために使用できる型のオブジェクトへの参照を返しconstます。

于 2013-04-05T16:43:34.617 に答える
0

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そして、古き良きものであるというマイク・シーモアのコメントを繰り返します。

于 2013-04-05T23:22:01.420 に答える