2012-04-22 12 views
8

"this"ポインタの操作でコンストラクタが呼び出されますか?*これはコンストラクタを呼び出しますか?

私は*this = *this + 1ようないくつかの操作をしていた場合、私は今のようにかなった...

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

を持っている主な機能に

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; 
    } 

を次のように定義されたコンストラクタを持っています。 このコンストラクタを2回呼び出します。

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

+4

コードをさらに表示してください。コピーコンストラクタと代入演算子が定義されていますか? –

+0

@RafałRawicki....いいえコピーコンストラクタや代入演算子は定義されていません。 –

+0

完全な例を投稿できますか? http://sscce.orgを参照してください。私は、この式ではCentsコンストラクタを一度呼び出す必要があります。 –

答えて

11

いいえ、ポインタを逆参照すると、新しいオブジェクトは作成されません。コンストラクタCents(int cents)が明示的としてマークされていないので、

Hoveverは、あなただけのクラスのインスタンスに対して定義されたoperator+を持っている場合は、1から構築新しいインスタンスが存在します。

+0

少し詳しく教えてください:) – Invictus

+0

@Ritesh参照:http://stackoverflow.com/a/121163/13767 :) –

3

ここではたくさんの工夫がなされています。

Cents c; 

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

は、次に、あなたが呼び出す:オブジェクトを返し、明示的Cents::Cents(int)への呼び出しを行う

Cents Cents::operator++(int) 

を。

次に、2番目の引数に2番目の呼び出しをCents::Cents(int)にする不思議な割り当てを行います。

あなたは、あなたが再びあなたはそれがやりたいことではないかもしれ合成さCents& Cents::operator=(const Cents&)を呼び出す

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

典型的なポストインクリメント演算子は次のようになります。それはコピーコンストラクタ(というよりもオーバーライド)を呼び出すことにより、増分前にあったように、それはクラスの値を返す方法

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

    ++m_cents; 

    return rv; 
} 

が気づくともクラスのメンバーを個別にインクリメントする方法。

関連する問題