C++ 为什么默认构造函数在某些情况下默认不可用

C++ 为什么默认构造函数在某些情况下默认不可用,c++,constructor,C++,Constructor,当我试图编译上述代码段时,我得到了如下错误消息: class foo { public: int a; int b; foo(int a_, int b_) : a(a_), b(b_) {} }; int main() { foo f; } 但是如果我用两个整数参数注释显式构造函数的文件,那么 代码可以编译。我猜魔法背后的规则是当你解释 用参数声明构造函数,C++编译程序将不生成 没有参数的默认构造函数 我说得对吗?如果我是对的,为什么C++有这样的行为?提前谢谢。是

当我试图编译上述代码段时,我得到了如下错误消息:

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

int main() {
  foo f;
}
但是如果我用两个整数参数注释显式构造函数的文件,那么 代码可以编译。我猜魔法背后的规则是当你解释 用参数声明构造函数,C++编译程序将不生成 没有参数的默认构造函数


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

是的,你说得对。如果声明构造函数,它不会声明任何隐式构造函数。至于原因,我不确定。

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

C++标准12.1/5:

类X的默认构造函数是类X的构造函数,无需参数即可调用。如果 类X没有用户声明的构造函数,默认构造函数是隐式声明的


如果您自己没有指定一个ctor,C语言只会生成一个默认的ctor。你可以在Cor中指定默认参数,虽然

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

这一点很明显——您应该有办法对没有意义的类禁用它。@mbq,您可以像对复制构造函数和赋值运算符一样将其声明为private这里有一个微妙的错误。[实际上,在现在的C++中,实际上有两个隐式声明的构造函数:默认构造函数和复制构造函数。如果存在任何用户声明的构造函数,则隐式声明的默认构造函数将被抑制。只有当存在用户声明的复制构造函数时,隐式声明的复制构造函数才会被抑制。@Michael这样,类本身仍然可以访问它,人们会有奇怪的想法。+1但也许应该注意,要使编译器成功生成默认的构造函数,成员还必须提供默认的构造函数(或者能够处于未初始化状态)。例如,存储引用会阻止编译器执行此操作,而不管是否存在用户定义的构造函数。在c++0x中,您可以要求编译器始终自动生成默认构造函数:
foo()=default
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&)
class foo {
public:
    foo(int a_ = 0, int b_ = 0) : a(a_), b(b_) {}
    int a;
    int b;
};