預設建構函式之編譯器的約定

2022-08-28 02:15:08 字數 1689 閱讀 4917

每個物件在建立的時候都會呼叫建構函式來為自己進行初始化。如果我們在類中並沒有提供現成的建構函式,那麼編譯器就會自動建立乙個預設地建構函式,它什麼都不會做,只會對我們所定義的物件進行初始化操作。比如說有乙個類a,如果在這個類裡面我們並沒有提供乙個建構函式,那麼編譯器就會自動為我們建立乙個不帶引數,函式體為空的預設建構函式:

a::a() {}

但是值得注意的一點是,如果我們自己在類中已經建立了乙個建構函式,那麼不管你建立的是像上面這樣的預設建構函式,還是乙個帶有引數的建構函式,編譯器都不會再為你提供任何預設建構函式。如下面這個程式:12

3456

78910

1112

1314

1516

17classdemo

intprint()

private:

intx;

};

#include

usingnamespacestd;

intmain()

在程式的第14行我們宣告了乙個物件a,但是與15行不同的是,我們想在這裡對a呼叫預設建構函式,希望它能夠被編譯器自己提供的預設建構函式所初始化。但是當我們一執行的時候,程式就報錯了:「error c2512: 「demo」: 沒有合適的預設建構函式可用」。

上面這個例子說明了,如果我們建立了乙個建構函式之後,那麼如果想要呼叫編譯器自己的預設建構函式,我們就必須在類中自己宣告乙個預設建構函式:

demo() {};

那麼,程式變成如下所示(在這個程式第3行中,我們自己宣告了乙個預設建構函式:12

3456

78910

1112

1314

1516

1718

classdemo;

demo(inti)

intprint()

private:

intx;

};

#include

usingnamespacestd;

intmain()

只有這樣,程式才能夠順利執行,輸出如下:

ok ,搞定,收工!!!

預設建構函式之編譯器的約定

每個物件在建立的時候都會呼叫建構函式來為自己進行初始化。如果我們在類中並沒有提供現成的建構函式,那麼編譯器就會自動建立乙個預設地建構函式,它什麼都不會做,只會對我們所定義的物件進行初始化操作。比如說有乙個類a,如果在這個類裡面我們並沒有提供乙個建構函式,那麼編譯器就會自動為我們建立乙個不帶引數,函式...

編譯器生成預設建構函式情況

1 類和物件 當乙個a類有預設建構函式,b類中包含a類物件,並且b類沒有建構函式,那麼編譯器會給b類生成預設建構函式 2 繼承 基類有預設的建構函式,派生類沒有顯示給出建構函式。這種情況下,因為建立派生類物件會呼叫基類的建構函式,所以編譯器認為有必要生成派生類建構函式,所以會生成乙個派生類的建構函式...

編譯器提供預設建構函式的幾種情況

在孫鑫的 vc 深入詳解 一書中,看到了這部分內容 在backer的幫助下,我們參看了ansic 的iso標準,並從彙編的角度試驗了幾種主流編譯器的行為,對於編譯器提供預設建構函式的行為得出下面的結論 如果乙個類中沒有定義任何建構函式,那麼只有以下三種情況時,編譯器才會提供預設建構函式 1 如果乙個...