定义类时,如果没有提供任何构造函数,C++将创建默认构造函数。例如,假设创建了一个Klunk类,但没有提供任何构造函数,编译器将提供 如下的默认构造函数:
Klunk::Klunk() { }
也就是说,编译器将提供一个不接受任何参数,也不执行任何操作的构造函数,这是因为创建对象时总会调用构造函数。
即“默认构造函数”这个术语对应的是 不接受任何参数,也不执行任何操作的构造函数。
如果定义了构造函数,编译器将不在提供默认构造函数。例如:
class test { public: test(int a); };
在定义对象时,如果使用 test obj; 编译器会提示错误,因为你自己定义了构造函数,编译器不在提供默认构造函数。一个修改的方法是 为入参提供默认值:
class test
{
public:
test(int a=0); //提供了默认值以后,就可以充当默认构造函数了。
};
即 带参数的构造函数也可以是默认构造函数,只要所有参数都有默认值。
但是,只能有一个默认构造函数,也就是说不能在定义类时这样做:
test();
test(int a=0);
如果这样做的话,test obj; 这样生成一个对象时,这两个构造函数都匹配,产生二义性,编译器报错。
Ref:
《C++ Primer Plus, 第五版》--12.1.2