1
一、首先,需要了解,一个空的类定义,不会生成构造函数
二、生成默认构造函数的情况有四种
1. 类B内数据成员是对象A,而类B提供了默认构造函数,为了让A的构造函数能被调用到,不得不为B生成默认构造函数
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A()" << endl;
}
};
class B
{
public:
A a;
int num = 10;
};
void Test()
{
B b;
cout << b.num << endl;
}
int main()
{
Test();
return 0;
}
运行结果:
2. 类的基类提供了默认构造函数
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
}
};
class Derived :public Base
{
public:
int d;
};
void Test()
{
Derived d;
}
int main()
{
Test();
return 0;
}
运行结果:
在这段代码中,Derived类作为Base的派生类,Derived在自身没有默认构造函数的时候,Derived是否提供默认构造函数,取决于Base有无默认构造函数,如果Base提供默认构造函数,则Derived也必须生成一个默认构造函数
3. 类内定义了虚函数
为了实现多态机制,需要为类维护一个虚函数表,类所有对象都需要保存一个指向该虚函数表的指针,对象需要初始化该虚函数表的指针,不得不提供默认构造函数来初始化虚函数表指针
4. 类使用了虚继承
虚基类表记录了类继承的所有虚基类子对象在本类定义的对象内的偏移位置,为了实现虚继承,对象在初始化阶段需要维护一个指向虚基类表的指针,不得不提供默认构造函数来初始化虚基类表指针