2012-05-30 129 views
2

/*下面的程序似乎神祕地進入遞歸,即使沒有在視線內。 編譯器:克++(Ubuntu的4.4.3-4ubuntu5.1)4.4.3 機:86 OS:Ubuntu的10.04 64位默認構造函數遞歸崩潰

*/

#include<iostream> 
    using namespace std; 

    class Test 
    { 
    public: 
     Test():x(9) 
     { 
     cout << " Test::Test\n"; 
     Test (x); 
     } 
     Test (int a) 
     { 
     cout << " Test::para\n"; 
     } 
    private: 
      int x; 
    }; 


int main(void) 
{ 
Test a; 
return 0; 
} 

這是爲什麼?

+0

如果我把x改成一些硬編碼值,比如說任何Int,它的工作正常,否則再次調用默認的構造函數n, – PeerPandit

+0

爲什麼你在默認構造函數中調用參數化構造函數? x已經在那裏使用成員初始化程序初始化了。順便說一句,你也可以定義'Test(int a = 9)'並且完全省略默認的構造函數。 –

+1

聽起來像一個編譯器錯誤。 –

回答

2

你不能在C++中調用其他構造函數。但首先是C++ 11,你可以在初始化器列表轉發構造函數調用:

class Test { 
public: 
    Test(): Test(9) { 
     cout << " Test::Test\n"; 
    } 

    Test (int a) : x(a) { 
     cout << " Test::para\n"; 
    } 

private: 
    int x; 
}; 

爲什麼你的代碼崩潰的說明,請參見Wolfgang’s answer

9
Test (x); 

被解析爲

Test x; 

...不是一個構造函數調用。 你也可以寫

Test (y); 

,並獲得相同的行爲。

+1

舊的「如果它可能是聲明或聲明 - 表達式,它是聲明」再次觸發! – aschepler

+0

太棒了!太糟糕了,我只能給一個單獨的讚揚。 –