1. 程式人生 > >c++編譯器何時會生成預設建構函式

c++編譯器何時會生成預設建構函式

轉自:點選開啟連結

預設的建構函式是指為所有引數都提供了預設值的建構函式,通常是指無參的建構函式。比如下面的類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)。