1

noGiven プライベート Member pData

private:
    T*    pData; // Generic pointer to be stored

以下は、* と -> のオーバーロードされた実装です。

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

T* operator-> ()
{
    return pData;
}

以下に示すように、メインから同じものを呼び出します。

void main(){
    SP<PERSON> p(new Person("Scott", 25));
    p->Display();
}

ここで -> および "*" 演算子のオーバーロードがどのように機能するのか理解できませんか? またはより明確にするために、どのp->Display(); ように解釈されますか?

4

1 に答える 1

2

->オペレーターは特別です。オブジェクトを返すと、自動的に再度適用されます。それが別のオブジェクトを返す場合、それも再び適用され、最終的にプレーンなポインターが返されます。これは連鎖と呼ばれ、プレーンなポインターが最終的に逆参照され、連鎖が停止します。

p->Display()したがって、次のように解釈されます。

p->Display(); // Compiler sees this
T* tmp = p.operator->(); // First applied operator-> (the one you provided)
tmp->Display(); // since T* is a pointer itself, operator-> (the built-in one for pointers) is applied
于 2013-09-12T17:06:39.520 に答える