預設建構函式和合成預設建構函式

2021-07-10 17:54:12 字數 1091 閱讀 9655

當我們沒有為類中的物件提供初始值,此時就會執行預設初始化,類會通過乙個特殊的建構函式來控制預設初始化過程,這個函式叫做預設建構函式,這個函式並不需要任何的實參,但是如果我們的類沒有顯式地定義建構函式,那麼編譯器就會為我們隱式地定義乙個預設建構函式(只要沒有顯式定義建構函式,編譯器就會提供預設建構函式,如果為類中的物件提供了初始值的話,就不會控制預設初始化過程了)。

實際上,預設建構函式並不一定都是編譯器隱式地提供的,而有可能是使用者自己寫出來的,前提是使用者本來已經寫過了其他的建構函式,但是仍然需要這樣的乙個預設建構函式的時候,就需要使用者自己進行書寫,此時沒有引數的建構函式就是建構函式,但是如果想要此時的建構函式和原來因為沒有定義建構函式而被編譯器隱式定義的合成的預設建構函式一樣的話,只需要在宣告後面寫乙個=default就可以了。如下:

class sales

對於系統隱式的預設建構函式,我們稱之為合成得預設建構函式。

但是實際上,有一部分時候我們已經有了自己定義的建構函式,但是仍然需要顯示地預設建構函式(但是肯定不是合成建構函式了,預設建構函式除了隱式的編譯器自己的合成預設建構函式之外就必須得像上例一樣顯示給出)

很多情況中,即使我們已經顯示地給出了建構函式,仍然需要顯示地給出缺省建構函式,具體大的情況分為兩種:預設初始化和值初始化

預設初始化分為:

1、當我們在類作用域內部使用任何初始值定義乙個非靜態變數或者資料時;

2、當乙個類本身含有類型別的成員且被含有的這個類型別的成員使用合成的預設建構函式時;

3、當類型別的成員沒有在建構函式初始值列表中顯式地初始化時;

值初始化分為:

1、在陣列初始化的過程中如果我們提供的初始值數量少於陣列的大小的時候;

2、當我們不使用初始值定義乙個區域性靜態變數的時候;

3、當我們通過書寫形如t()的表示式顯式地請求值初始化時,其中t是型別名,比如vector()中可以只用乙個實參用於說明vector中的元素個數,而當括號裡是類的    話;

所以因為有以上情況的存在,在已經存在建構函式的情況下,(也就是說此時沒有合成預設建構函式的時候是沒有預設建構函式的)就需要我們主動顯式指出預設建構函式,所以在c++primer中是估計我們即使在已經有建構函式的情況下。

預設建構函式

只要定義乙個物件時沒有提供初始化式,就使用預設建構函式。為所有形參提供預設實參的建構函式也定義了預設建構函式。乙個類哪怕只定義了乙個建構函式,編譯器也不會再生成預設建構函式。這條規則的根據是,如果乙個類在某種情況下需要控制物件初始化,則該類很可能在所有情況下都需要控制。合成的預設建構函式 synth...

預設建構函式

原諒我是個菜鳥,總在些小地方不經意出錯。include using namespace std class x x x private int a int main 你是否看得出 出錯了呢?接下來讓我們編譯看看 constructfunc.cpp in function int main const...

預設建構函式

如果定義了其他建構函式,最好也提供乙個預設建構函式 不帶引數或帶預設引數的建構函式 include include include using namespace std class nodefault struct a struct b nodefault b member 錯誤 沒有合適的預設建...