每個物件在建立的時候都會呼叫建構函式來為自己進行初始化。如果我們在類中並沒有提供現成的建構函式,那麼編譯器就會自動建立乙個預設地建構函式,它什麼都不會做,只會對我們所定義的物件進行初始化操作。比如說有乙個類a,如果在這個類裡面我們並沒有提供乙個建構函式,那麼編譯器就會自動為我們建立乙個不帶引數,函式體為空的預設建構函式:
a::a() {}
但是值得注意的一點是,如果我們自己在類中已經建立了乙個建構函式,那麼不管你建立的是像上面這樣的預設建構函式,還是乙個帶有引數的建構函式,編譯器都不會再為你提供任何預設建構函式。如下面這個程式:12
3456
78910
1112
1314
1516
17class
demo
int
print()
private
:
int
x;
};
#include
using
namespace
std;
int
main()
在程式的第14行我們宣告了乙個物件a,但是與15行不同的是,我們想在這裡對a呼叫預設建構函式,希望它能夠被編譯器自己提供的預設建構函式所初始化。但是當我們一執行的時候,程式就報錯了:「error c2512: 「demo」: 沒有合適的預設建構函式可用」。
上面這個例子說明了,如果我們建立了乙個建構函式之後,那麼如果想要呼叫編譯器自己的預設建構函式,我們就必須在類中自己宣告乙個預設建構函式:
demo() {};
那麼,程式變成如下所示(在這個程式第3行中,我們自己宣告了乙個預設建構函式:12
3456
78910
1112
1314
1516
1718
class
demo;
demo(
int
i)
int
print()
private
:
int
x;
};
#include
using
namespace
std;
int
main()
只有這樣,程式才能夠順利執行,輸出如下:
ok ,搞定,收工!!!
預設建構函式之編譯器的約定
每個物件在建立的時候都會呼叫建構函式來為自己進行初始化。如果我們在類中並沒有提供現成的建構函式,那麼編譯器就會自動建立乙個預設地建構函式,它什麼都不會做,只會對我們所定義的物件進行初始化操作。比如說有乙個類a,如果在這個類裡面我們並沒有提供乙個建構函式,那麼編譯器就會自動為我們建立乙個不帶引數,函式...
編譯器生成預設建構函式情況
1 類和物件 當乙個a類有預設建構函式,b類中包含a類物件,並且b類沒有建構函式,那麼編譯器會給b類生成預設建構函式 2 繼承 基類有預設的建構函式,派生類沒有顯示給出建構函式。這種情況下,因為建立派生類物件會呼叫基類的建構函式,所以編譯器認為有必要生成派生類建構函式,所以會生成乙個派生類的建構函式...
編譯器提供預設建構函式的幾種情況
在孫鑫的 vc 深入詳解 一書中,看到了這部分內容 在backer的幫助下,我們參看了ansic 的iso標準,並從彙編的角度試驗了幾種主流編譯器的行為,對於編譯器提供預設建構函式的行為得出下面的結論 如果乙個類中沒有定義任何建構函式,那麼只有以下三種情況時,編譯器才會提供預設建構函式 1 如果乙個...