默认构造函数(default constructor)就是在没有显示提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。若个定义某个类的变量时没有提供初始化式就会使用默认构造函数。
如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数。
多数情况下,编译器为类生成一个公有的默认构造函数,例如:
1.我们知道,若某类/函数中有成员是类对象(a),那么它会自动调用A的默认构造函数;
1 class A 2 { 3 }; 4 5 class B 6 { 7 public: 8 A a; 9 };
2.类中存在虚函数,或者基类是虚基类,那么编译器会自动调用构造函数来初始化虚函数表或者虚基类表。
3. ...
但是以下情况例外:
1.一个类显式的声明了任何构造函数或者是非公有的默认构造函数,编译器不生成公有的默认构造函数。
1 class A 2 { 3 private: 4 int num; 5 public: 6 A(int n) 7 { 8 num=n; 9 } 10 }; 11 12 13 int main() 14 { 15 A a;//error C2512: “A”: 没有合适的默认构造函数可用 16 return 0; 17 }
**2.派生类默认调用基类构造函数来完成基类初始化,如果基类没有提供这个默认构造函数,那么编译器不会为派生类生成默认的构造函数。
1 class A 2 { 3 private: 4 int A_num; 5 public: 6 //A(){}; //若是没有,则下面报错; 7 A(int n) 8 { 9 A_num=n; 10 } 11 }; 12 13 class B:public A 14 { 15 private: 16 int B_num; 17 public: 18 B(int n) 19 { //error C2512: “A”: 没有合适的默认构造函数可用 20 B_num=n; 21 } 22 };
3. ...
欢迎补充,谢谢!