编译器什么时候会产生默认构造函数?
- 类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么编译器会帮你给这个类也生成一个默认构造函数,用来调用其他成员对象的构造函数,完成该成员的初始化构造。如果这个成员的类也没有给出默认构造函数,那么编译器也不会帮你生成该类的默认构造函数。
-
class Qita { public: Qita() { std::cout << "其他类的默认构造函数"<<endl; } }; class DefaultConstructorClass { public: void display() { std::cout << "DefaultConstructorClass" << endl; } private: Qita a; };
比如在DefaultConstructorClass类中声明了Qita类的一个对象,那么在Qita类中有默认构造函数,那么编译器会帮DefaultConstructorClass类生成一个默认构造函数,用来调用其他成员对象的构造函数,完成对该成员的初始化构造。
- 这个类的基类有默认构造函数,那么编译器会帮你生成该派生类的默认构造函数,以调用基类的默认构造函数,完成基类的初始化,如果基类没有提供这个默认构造函数,那么编译器也不会为派生类生成派生类的默认构造函数。
-
class Qita { public: Qita() { std::cout << "其他类的默认构造函数"<<endl; } }; class DefaultConstructorClass:public Qita { public: };
- 类中存在虚函数,那么编译器会为你生成默认构造函数,以初始化虚表,
-
class Qita { public: virtual void display() { std::cout << "Qita" << endl; } }; class DefaultConstructorClass :public Qita { public: void display() { std::cout << "DefaultConstructorClass" << endl; } private: }; int main() { DefaultConstructorClass d; Qita t=d; d.display(); }
- 存在虚基类,那么编译器会为你生成默认构造函数,以初始化虚基类表。
-
class Qita { public: virtual void display() = 0; }; class DefaultConstructorClass :virtual public Qita { public: void display() { std::cout << "DefaultConstructorClass" << endl; } };