转自:点击打开链接
默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类Test,它的默认构造函数就是Test()。
class Test { public: Test(){} // default constructor } ;
如果你没有为你的类提供任何构造函数,那么编译器将自动为你生成一个默认的无参构造函数。一旦你为你的类定义了构造函数,哪怕只是一个,那么编译器将不再生成默认的构造函数。
class A
{
public:
A(int i):num(i)
{
cout<<"constructor A"<<endl;
}
virtual ~A()
{
cout<<"destructor A"<<endl;
}
virtual void fun_const1(){cout<<"fun_const1 A, num is:"<<num<<endl;}
};
class B: public A
{
public:
B()
{
cout<<"constructor B"<<endl;
}
~B()
{
cout<<"destructor B"<<endl;
}
void fun_const1(){cout<<"fun_const1 B, num is:"<<num<<endl;}
};<span style="color:#ff0000;">
</span>
这里B中会提示A未提供默认构造函数(A中有非默认构造函数,因此编译器不会生成默认的)
转自:点击打开链接
另外几种会生成默认构造函数的情况:
第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造。需要强调的是,如果这个成员的类也没有给出默认构造函数,那么C++编译器也不会帮你生成该类的默认构造函数。
第二种情况是这个类的基类有默认构造函数。那么C++编译器也会帮你生成该派生类的默认构造函数,以调用基类的默认构造函数,完成基类的初始化。另外还得强调一下的是,如果基类没有提供这个默认构造的函数,那么C++编译器也不会为派生类生成默认的构造函数(这里包括两层意思,第一,基类没有任何形式构造函数;第二,基类存在其他形式的非默认构造函数,当然了,这种类型就是编译不过的,道理很明显)。
第三种情况是类中存在虚函数,那么C++编译器会为你生成默认构造函数,以初始化虚表(虚函数表vftable)。
第四种情况是存在虚基类,那么C++编译器会为你生成默认构造函数,以初始化虚基类表(vbtable)。