2014-04-25 181 views
0
#include <iostream> 

using namespace std; 

class Counter 
{ 
protected: 
    unsigned int count; 
public: 
    Counter() : count(0) {cout << "\nCounter Default Constructor";} 
    Counter(int i) : count (i) {cout << "\nCounter Argument Constructor";} 

    unsigned int getData() 
    { 
     return count; 
    } 


    Counter operator ++() // increment (prefix) 
    { 
     ++count; 
     return Counter(count); 
    } 
}; 

class inCounter : public Counter 
{ 
public: 
    inCounter() : Counter() { cout << "\ninCounter Default Constructor"; } 
    inCounter(int c) : Counter (c) {cout << "\ninCounter Argument Constructor";} 

    Counter operator --() 
    { 
     --count; 
     return Counter (count) ; 

    } 
}; 

void main() 
{ 
    inCounter c1(10); } 

時不叫兩聲基類的構造我期待的輸出爲:使用初始化列表

計數器參數的構造函數

inCounter參數的構造函數

計數器參數的構造函數

但它出來是

計數器參數的構造函數

inCounter參數的構造函數

爲什麼會這樣呢?

我期待第一個輸出的原因是,在創建對象c1期間,首先調用基類構造函數,因此打印了"Counter Argument Constructor"。然後,調用派生類的構造函數,因此打印"inCounter Argument Constructor"。但派生類構造函數再次調用Counter構造函數。所以,"Counter Argument Constructor"應該再次打印。

+5

爲什麼你希望'反駁Constructor'出現兩次? – timrau

+0

爲什麼你會期望Conter類的構造函數運行兩次? – tebe

+2

你應該解釋爲什麼你期望三個構造函數調用。否則,你的問題就是「爲什麼3 + 3等於6,如果我期待7?」的話。 – juanchopanza

回答

3

如果通過初始化列表初始化成員,那麼將替換編譯器將執行的默認初始化。

這不是一個「額外」的呼叫 - 因爲這將意味着一個對象得到了構建兩次。

此外,您還可以通過在你的情況下,使用默認參數簡化事情。這將允許您刪除一些不需要的構造函數。

inCounter(int c=0) : Counter (c) 
{ 
    cout << "\ninCounter Argument Constructor"; 
} 
0

我認爲你是混淆在程序中以下行,

inCounter(int c) : Counter (c) {cout << "\ninCounter Argument Constructor";} 

雖然你們有計數器(C)在你的代碼,它不會調用構造函數的兩倍。而是它調用下面顯示的基類構造函數的參數化版本。

Counter(int i) : count (i) {cout << "\nCounter Argument Constructor";} 

所以,正確的輸出,

Counter Argument Constructor 

inCounter Argument Constructor