c++編譯器何時會生成預設建構函式
阿新 • • 發佈:2018-12-05
轉自:點選開啟連結
預設的建構函式是指為所有引數都提供了預設值的建構函式,通常是指無參的建構函式。比如下面的類Test,它的預設建構函式就是Test()。
class Test { public: Test(){} // default constructor } ;
如果你沒有為你的類提供任何建構函式,那麼編譯器將自動為你生成一個預設的無參建構函式。一旦你為你的類定義了建構函式,哪怕只是一個,那麼編譯器將不再生成預設的建構函式。
這裡B中會提示A未提供預設建構函式(A中有非預設建構函式,因此編譯器不會生成預設的)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>
轉自:點選開啟連結
另外幾種會生成預設建構函式的情況:
第一種是類成員中有成員是類物件,並且該成員的類含有預設建構函式,那麼C++編譯器會幫你給這個類也生成一個預設建構函式,用來呼叫其成員物件的建構函式,完成該成員的初始化構造。需要強調的是,如果這個成員的類也沒有給出預設建構函式,那麼C++編譯器也不會幫你生成該類的預設建構函式。
第二種情況是這個類的基類有預設建構函式。那麼C++編譯器也會幫你生成該派生類的預設建構函式,以呼叫基類的預設建構函式,完成基類的初始化。另外還得強調一下的是,如果基類沒有提供這個預設構造的函式,那麼C++編譯器也不會為派生類生成預設的建構函式(這裡包括兩層意思,第一,基類沒有任何形式建構函式;第二,基類存在其他形式的非預設建構函式,當然了,這種型別就是編譯不過的,道理很明顯)。
第三種情況是類中存在虛擬函式,那麼C++編譯器會為你生成預設建構函式,以初始化虛表(虛擬函式表vftable)。
第四種情況是存在虛基類,那麼C++編譯器會為你生成預設建構函式,以初始化虛基類表(vbtable)。