編譯器什麼時候會産生預設構造函數?
- 類成員中有成員是類對象,并且該成員的類含有預設構造函數,那麼編譯器會幫你給這個類也生成一個預設構造函數,用來調用其他成員對象的構造函數,完成該成員的初始化構造。如果這個成員的類也沒有給出預設構造函數,那麼編譯器也不會幫你生成該類的預設構造函數。
-
比如在DefaultConstructorClass類中聲明了Qita類的一個對象,那麼在Qita類中有預設構造函數,那麼編譯器會幫DefaultConstructorClass類生成一個預設構造函數,用來調用其他成員對象的構造函數,完成對該成員的初始化構造。class Qita { public: Qita() { std::cout << "其他類的預設構造函數"<<endl; } }; class DefaultConstructorClass { public: void display() { std::cout << "DefaultConstructorClass" << endl; } private: Qita a; };
- 這個類的基類有預設構造函數,那麼編譯器會幫你生成該派生類的預設構造函數,以調用基類的預設構造函數,完成基類的初始化,如果基類沒有提供這個預設構造函數,那麼編譯器也不會為派生類生成派生類的預設構造函數。
-
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; } };