我不明白的默认构造函数

时间:2013-11-27 03:43:49

标签: c++ linux constructor g++ default-constructor

我有这段代码:

#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);
}

编译:

$  g++ main.cc -Wall

当我跑步时,我得到了:

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

ZombieFetus band1();到底是什么?该计划是什么?这是一个初学者的问题,如果已经在stackoverflow上回答,请给我链接...我找不到答案......

thx给所有回答的人和所有的comentators

(你有点太多了,不能一个接一个)

4 个答案:

答案 0 :(得分:7)

问题在于:

ZombieFetus  band1();

是一个解释为函数声明,在 C ++ 11 中有两个可能的修复:

ZombieFetus  band1{} ;

或预先 C ++ 11

ZombieFetus  band1;

clang在这里稍微helpful并发出警告:

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

答案 1 :(得分: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 :(得分:2)

变化:

  

ZombieFetus band1();

  

ZombieFetus band1;

在实例化没有参数的对象时,不应使用括号。

答案 3 :(得分:2)

ZombieFetus band1();声明一个名为band1的函数,该函数不带参数并返回类型ZombieFetus的值。 如果你想使用默认构造函数'ZombieFetus band1;'会没事的。 希望这会有所帮助。