預設建構函式

2021-06-29 03:58:44 字數 838 閱讀 3263

原諒我是個菜鳥,總在些小地方不經意出錯。。。

#include 

using

namespace

std;

class x

x()~x()

private:

int a;

};int main()

你是否看得出**出錯了呢?

接下來讓我們編譯看看:

constructfunc.cpp: in function 『int main()』:

constructfunc.cpp:32: error: call of overloaded 『x()』 is ambiguous

constructfunc.cpp:12: note: candidates are: x::x()

constructfunc.cpp:7: note: x::x(int)

這裡表示對建構函式的選擇上出現二義。那麼回看我們的程式,其實這裡生成兩個例項的方式是p希望是設定引數為1,呼叫有引數的建構函式。p1是無引數構造。

那麼回看我們的建構函式,這裡發現了乙個問題:

x(int t = 0)

實際上這也是我們的預設建構函式。

什麼是預設建構函式:不需要在例項化物件的時候指定實參。

所以這裡有了兩個預設建構函式:

x::x()

x::x(int t = 0)

乙個類中,不能有兩個預設建構函式,導致例項化物件時,編譯器無法候選適當的建構函式。

解決方法:

實際上,我們是想要過載建構函式,即有實參的建構函式:

x(int t)

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

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

預設建構函式

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

預設建構函式

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