2013-11-27 46 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'会没事的。 希望这会有所帮助。