2013-11-27 42 views
2

我有這樣的代碼:一些有關的默認構造函數我不明白

#include <iostream> 

class ZombieFetus{ 
    private: 
    public: 
    ZombieFetus(); 
}; 

ZombieFetus::ZombieFetus(){ 
    std::cout << "http://www.metal-archives.com/band/view/id/55878" << std::endl; 
}; 

class FaceOfAVirus{ 
    private: 
    public: 
    FaceOfAVirus(int); 
}; 

FaceOfAVirus::FaceOfAVirus(int i){ 
    std::cout << "http://www.metal-archives.com/band/view/id/74239" << std::endl; 
}; 


int main(int argc, char **argv){ 
    std::cout << "some random bands :" << std::endl; 
    ZombieFetus band1(); 
    FaceOfAVirus band2(0); 
} 

到compil:

$ g++ main.cc -Wall 

當我運行它,我得到了:

some random bands : 
http://www.metal-archives.com/band/view/id/74239 

什麼與ZombieFetus band1();赫克?該計劃是什麼?它的聲音是一個初學者的問題,如果它已經回答了計算器,PLZ給我的鏈接...我沒有找到答案......

THX大家誰回答所有comentators

(你是一個有點罄竹難書THX逐個)

+0

這是一個功能。 – chris

+0

@chris這是一個函數嗎?這是一個ZombieFetus類型的對象 – Pepe

+0

@chris你是什麼意思?我沒有在[最棘手的解析(C++)的定義 –

回答

7

問題的「前進」的聲明是這樣的:

ZombieFetus band1(); 

是intepreted爲函數聲明,你有兩種可能的修復方法C++ 11

ZombieFetus band1{} ; 

或預C++ 11

ZombieFetus band1; 

clang是一個小更helpful這裏並警告:

warning: empty parentheses interpreted as a function declaration [-Wvexing-parse] 
     ZombieFetus band1(); 
         ^
+0

對於聖誕節,我會請聖誕老人在我的電腦上安裝clang。是不是我第一次看到鐺提供了更好的錯誤信息和警告信息... –

+0

@bobthemightyspellcaster有幾個[在線編譯器(http://stackoverflow.com/questions/3916000/online-c-compiler-and-評估者),您可以使用並在沒有本地安裝的情況下嘗試。 –

+0

我從來沒有聽說過那個...... –

3

默認構造函數不帶參數,所以刪除() 像

ZombieFetus band1; 

,你會得到

make -k x; ./x 
g++  x.cc -o x 
some random bands : 
http://www.metal-archives.com/band/view/id/55878 
http://www.metal-archives.com/band/view/id/74239 

但是,這是一個函數的BAND1返回ZombieFetus

ZombieFetus band1(); 
2

變化:

ZombieFetus BAND1();

ZombieFetus BAND1;

當實例化一個沒有參數的對象時,你不應該使用括號。

+0

+1(還有其他一些人也瞭解它)。你也可以做'ZombieFetus band1 = ZombieFetus();'如果它讓你對decl感覺更好,那麼任何值得它的salt的編譯器都會隱藏副本。如果沒有,請獲得一個新的編譯器。 – WhozCraig

2

ZombieFetus band1();聲明瞭一個名爲band1的函數,該函數不帶參數並返回ZombieFetus類型的值。 如果你想使用默認的構造函數'ZombieFetus band1'會沒事的。 希望這會有所幫助。