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 ++有这样的行为?提前谢谢。
答案 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 ++不再提供这个默认值,因为你应该完全控制如何使用类的对象(比如,应该如何构造它们)。因此,如果您没有指定默认构造函数,则可以使用不带参数的可构造对象,这通常很有用。