8

「this」ポインターの操作はコンストラクターを呼び出しますか?

次のように定義されたコンストラクターがあります

    Cents(int cents)
    {
            cout<<"in cents constructor\n";
            m_cents = cents;
    }

    friend Cents operator + (const Cents &c1, const Cents &c2)
    {           
            return Cents(c1.m_cents + c2.m_cents);
    }

    Cents operator ++ (int)
    {
            cout<<"In c++ function\n";
            Cents c(m_cents);
            *this = *this + 1 ;
            return c;
    }

主な機能では、次のようなものがあります...

    Cents c;
    cout<<"Before post incrementing\n";
    c++; //This part is calling the constructor thrice 

今、次のような操作を行っているとし*this = *this + 1ます。このコンストラクターを 2 回呼び出します。

ここで何が起こっているのか。*this一時オブジェクトを作成し、その値を元のオブジェクトに割り当てますか?

4

2 に答える 2

11

いいえ、ポインターを逆参照しても、新しいオブジェクトは作成されません

ただし、operator+クラスのインスタンスに対してのみ定義した場合は、コンストラクターが明示的にマークされていないため、から構築された新しいインスタンスがあります。 1Cents(int cents)

于 2012-04-22T10:39:48.453 に答える
3

ここではたくさんの建設が進行中です!

Cents c;

この行は を呼び出しますCents::Cents()。これはコンパイラによって合成され、意図したとおりに動作しない可能性があります。

次に、次のように呼び出します。

Cents Cents::operator++(int)

オブジェクトを返し、明示的に を呼び出しますCents::Cents(int)

Cents::Cents(int)次に、2 番目の引数に対する2 番目の呼び出しを行う、興味深い割り当てを行います。

呼び出すCents operator+(const Cents&, const Cents&)と、明示的に新しいものを構築し、Cents::Cents(int)そのコピーを返します...

次に、 generated を呼び出しますがCents& Cents::operator=(const Cents&)、これも意図したとおりに実行されない場合があります。

典型的な後置インクリメント演算子は次のようになります。

Cents& operator++(int)
{
    Cents rv = *this;

    ++m_cents;

    return rv;
}

(オーバーライドではなく) コピー コンストラクターを呼び出してインクリメント前のクラスの値を返す方法と、クラスのメンバーを個別にインクリメントする方法に注意してください。

于 2012-04-22T11:17:01.430 に答える