2012-04-22 88 views
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一些操作。 它調用這個構造函數兩次。

這裏究竟發生了什麼。 *this是否創建臨時對象並將該值賦給原始對象?

+4

請向我們展示更多代碼。你有複製構造函數和賦值運算符定義? – 2012-04-22 10:36:51

+0

@RafałRawicki....不,我沒有任何複製構造函數或賦值運算符定義。 – 2012-04-22 10:40:32

+0

你能發佈完整的例子嗎?請參閱http://sscce.org我認爲,應該在此表達式中調用一次Cents構造函數,而不是兩次。 – 2012-04-22 10:41:52

回答

11

沒有,解引用指針不會創建任何新的對象

Hovever,如果你只爲你的類定義operator+,屆時將有來自1構建的新實例,因爲構造Cents(int cents)沒有標記爲明確。

+0

可否請您詳細說明一下:) – Invictus 2012-04-22 10:42:29

+0

@Ritesh請參閱:http://stackoverflow.com/a/121163/13767 :) – 2012-04-22 10:44:32

3

你已經打算在一大堆contsructions這裏!

Cents c; 

此行調用Cents::Cents(),這是由編譯器合成的,你想讓它什麼也不會做。

然後調用:

Cents Cents::operator++(int) 

它返回一個對象,並明確地讓到Cents::Cents(int)通話。

然後你做你的好奇分配,這使得第二個參數Cents::Cents(int)第二個呼叫。

當你調用Cents operator+(const Cents&, const Cents&)你明確構建一個新的Cents::Cents(int)並返回它的一個副本...

然後調用合成Cents& Cents::operator=(const Cents&),再次你希望它是什麼可能做不到。

一個典型的遞增運算符是這樣的:它

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

    ++m_cents; 

    return rv; 
} 

注意如何返回類的價值,因爲它是增量前通過調用拷貝構造函數(而不是替代),也它是如何逐個增加班級成員的。