构造函数中的奇怪行为

时间:2009-02-03 09:35:38

标签: c++ parameters constructor

我有一个由几个字段组成的类,我有几个构造函数。我也有一个不带任何参数的构造函数,但是当我尝试使用它时:

int main {
    A a;
}

编译器会生成错误,而如果我像这样使用它:

int main {
    A a();
}

没关系。那是什么?

谢谢

4 个答案:

答案 0 :(得分:11)

第一个main使用A的默认构造函数。第二个声明一个不带参数的函数,并返回一个A值,这可能不是你想要的。

那么A的定义是什么样的,编译器生成的错误是什么?

哦,你需要在main int main() { //...的声明中提供一个参数列表,而不是int main { //...

答案 1 :(得分:2)

你好意味着它编译或它的工作原理?代码行:

   A a();

是名为a的函数的声明(或原型),它不接受任何参数并返回类型为A的对象。

我认为任何人都有机会帮助您解决真正的问题,至少需要发布class A的声明。

答案 2 :(得分:1)

Charles和Michael Burr都发现第二个声明实际上是一个函数原型而不是A的实例化。

至于您的第一个代码段不起作用的可能原因,在以下情况下您会收到编译错误:

  1. A继承自没有默认构造函数的基类; OR
  2. A包含没有默认构造函数的类型的对象; OR
  3. 班级A包含参考成员;
  4. 您提供了一个默认构造函数,它从其初始化列表中省略了一个或多个这些子对象。

    所有这些子对象都需要某种方式进行初始化,编译器生成的默认构造函数不会这样做。请注意,在所有情况下,您都需要在初始化列表中初始化它们,而不是构造函数的 body

答案 3 :(得分:0)

你是对的,我在里面有一个问题。