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

Hai*_*ang 3 c++ constructor

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

int main() {
  foo f;
}
Run Code Online (Sandbox Code Playgroud)

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

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&)
Run Code Online (Sandbox Code Playgroud)

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

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

Kir*_*sky 9

仅当没有用户定义的构造函数时,编译器才会生成默认构造函数.

C++标准版12.1/5:

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

  • +1但也许应该注意,为了使编译器成功生成默认ctor,成员还必须提供默认ctor(或能够处于未初始化状态).例如,存储引用会阻止编译器执行此操作,无论是否存在用户定义的ctors. (2认同)