每個類都分別定義了它的物件被初始化的方式,類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫做建構函式。從定義中,首先可以得知以下兩點:
建構函式也是一種類的成員函式,但是其有特殊性。
任務是初始化類物件的資料成員,所以無論何時只要類物件被建立,就會執行建構函式。
建構函式沒有返回型別分析上述中的第3、4點:顯示呼叫建構函式和預設建構函式建構函式的函式名需要與類名一致
建構函式不是由物件呼叫的,而建構函式一般物件建立時系統自動執行建構函式,當然也可以顯示呼叫建構函式,這裡言外之意就是建構函式不能被外部呼叫。
建構函式是乙個類必須有的,若沒有定義建構函式,編譯器在程式需要時會建立乙個預設的建構函式
1 #include2
3 class a
4 ;11
12 13 a::a()
14 17
18 a::a(int x)
19 22
23 a::~a()
24 27
28 29 int main()
30
輸出結果:
this is the default constructor!
this is the customize constructor!
this is the destructor!
this is the destructor!
分析:這段**很有意思,首先建立乙個物件test,然後系統呼叫預設建構函式a()。那什麼叫預設建構函式呢?
預設建構函式就是在呼叫時不需要顯示地傳入實參的建構函式若類沒有建構函式時,編譯器會制度牌沒提供乙個預設建構函式。當然乙個類,不能有兩個預設建構函式。
所以以下兩個預設建構函式是不能同時存在的。
1 class a
2 ;6
7 a::a(int i)
8 11
12 int main()
13
編譯後,會發現報錯。 其實從過載就可以解釋,系統不知道該呼叫哪個預設建構函式。
程式自己定義的建構函式就不用多解釋了(其實一般寫程式都自己加上的),但是如果沒有建構函式,則物件建立的時候,編譯器會自動生成乙個預設建構函式。那麼這個編譯器生成的預設建構函式有什麼用呢?
預設建構函式作用1-無用建構函式
只是為了滿足程式能執行,並不幹其他事情,如初始化資料成員。見下面**:
1 #include2 class a
3 ;7
8 9 int main()
10 /以上**等同於
class a
;
輸出結果為:m_num=-1031285632
從結果可以看出,雖然編譯器會提供乙個預設建構函式,但是這個建構函式沒有做任何事情,這與我們定義了乙個空的預設建構函式作用一樣。
但是為什麼編譯器生成的預設建構函式沒有初始化變數m_num,這裡有個規則:
定義在塊中的內建型別或復合型別(比如陣列和指標)的物件被預設初始化,則它們的值將是未定義的。因此,含有內建型別或復合型別成員的類應該在類的內部初始化這些成員,或者定義乙個自己的預設建構函式。否則,使用者在建立類的物件時就可能得到未定義的值。對於無用的預設建構函式,我看過一些部落格,他們認為這種無用的預設建構函式不能算建構函式,因為如果用vs編譯上述**壓根就編譯不了,vs給的錯誤提示是區域性變數test未初始化。但是我還是理解只要沒有顯示提供建構函式,編譯器就會生成乙個預設建構函式,不管有用還是沒用。
以上僅個人在當前的意見!不一定對!
預設建構函式作用2-有用建構函式
一般上,當編譯器被需要時才生成有用的建構函式,分為以下4個情形:
當該類的類物件資料成員有預設建構函式時。
當該類的基類有預設建構函式時。
當該類的基類為虛基類時。
當該類有虛函式時。
這部分可以參考部落格:
預設建構函式分析就到此。
之前**中有
a test;
test = a(10);
從字面上似乎可以這樣理解,先建立乙個物件test,然後顯示呼叫建構函式a(int x),在將乙個東西賦值給test,因為test是個物件,那麼這個東西也應該是物件。
這裡有兩個知識點:
(1)無名物件
(2)賦值建構函式
(3)explicit關鍵字:這個是隱藏知識點,這裡不介紹了。
首先a(10)產生乙個無名物件,然後通過賦值建構函式(上述**編譯器預設提供了operator =),賦值給test物件,然後這個無名物件銷毀,呼叫析構函式。
無名物件:也叫臨時物件。指的是直接由建構函式產生,但是沒有被任何符號所引用的物件。例如:string("abc"),這句話產生的就是乙個無名物件,這個物件產生以後,沒有什麼辦法使用它。但是對於string str("abc")來說,則產生的是乙個有名字的物件,他的名字就是 str。無名物件的用法這裡不深入**了。
賦值建構函式和拷貝建構函式,這裡就不介紹了,下次單獨再寫。
還有建構函式初始化問題。
再一次感受到c++的魅力!
C 拷貝建構函式介紹
拷貝構造函式呼叫的三種情況 1.使用乙個已經建立完畢的物件來初始化乙個新物件 2.值傳遞的方式給函式引數傳值 3.以值方式返回區域性物件 include using namespace std class person person int age person const person p per...
c 建構函式介紹及實現
假期 2020.02 02學習總結資源 於中國大學mooc,c語言中文網 類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。系統預設建構函式 預設的建構函式沒有任何引數 class complex 編譯器自動生成預設建構函式 complex c1 預設建構函式被呼叫 comple...
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...