默认情况下,默认构造函数在某些情况下不可用的原因

时间:2010-07-02 05:45:51

标签: c++ constructor

class foo {
public:
   int a;
   int b;
   foo(int a_, int b_) : a(a_), b(b_) {}
};

int main() {
  foo f;
}

当我尝试编译上面的代码片段时,我收到如下错误消息:

foo.cc: In function 'int main()'

foo.cc:12: error: no matching function for call to 'main()::foo::foo()'

foo.cc:10: note: candidates are: main()::foo::foo(int, int)

foo.cc:6:  note:                 main()::foo::foo(const main()::foo&)

但如果我用两个整数prarmeters评论显式构造函数的文件,那么 代码可以编译。我猜这个魔法背后的规则是当你明白时 用参数声明构造函数,c ++ compilor不会自动生成一个 没有参数的默认构造函数。

我是对的吗?如果是对的,为什么c ++有这样的行为?提前谢谢。

4 个答案:

答案 0 :(得分:9)

只有在没有用户定义的构造函数时,编译器才会生成默认构造函数。

C ++标准版12.1 / 5:

  

类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用。如果   对于类X没有用户声明的构造函数,默认构造函数是隐式声明的。

答案 1 :(得分:2)

是的,你是对的。如果声明构造函数,则它不会声明任何隐式构造函数。至于为什么,我不确定。

答案 2 :(得分:1)

class foo {
public:
    foo(int a_ = 0, int b_ = 0) : a(a_), b(b_) {}
    int a;
    int b;
};

如果您自己未指定C语言,则C语言仅生成默认ctor。您可以通过

为ctor指定默认参数

答案 3 :(得分:1)

基本上,如果您没有显式构造函数,C ++会尝试通过提供默认构造函数来兼容C结构和其他普通旧数据类型,以便可以正常定义和使用其对象。但是如果你有一个显式的构造函数,C ++不再提供这个默认值,因为你应该完全控制如何使用类的对象(比如,应该如何构造它们)。因此,如果您没有指定默认构造函数,则可以使用不带参数的可构造对象,这通常很有用。