天天看點

c++中預設構造函數編譯器什麼時候會産生預設構造函數?

編譯器什麼時候會産生預設構造函數?

  • 類成員中有成員是類對象,并且該成員的類含有預設構造函數,那麼編譯器會幫你給這個類也生成一個預設構造函數,用來調用其他成員對象的構造函數,完成該成員的初始化構造。如果這個成員的類也沒有給出預設構造函數,那麼編譯器也不會幫你生成該類的預設構造函數。
  • 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;
    	}
    
    };
               

繼續閱讀