本篇是介紹c++的建構函式的第一篇(共二篇),屬於讀書筆記,對c++進行乙個系統的複習。
全域性變數未初始化時為0,區域性變數未初始化時的值卻是無法**的。這是因為,全域性變數的初始化是再程式裝載時便一次性完成的,自動地初始化為零並不會有額外的開銷,因此編譯器預設初始化為零。但是對區域性變數並沒有這樣的操作,需要程式去完成初始化。
基本型別變數的初始化只需要在定義時賦值就可以了,但是對於物件的初始化,情況就要複雜一些。比如,有的物件需要在建立時就令某個指標指向一塊記憶體空間,這就涉及到空間的分配;再比如,有的物件包含檔案操作,在建立時就需要開啟特定檔案。舉這兩個例子是要說明,物件的初始化,不僅僅是簡單賦值那麼簡單。因此建構函式(constructor)是必要的,它的存在就是為了完成物件的初始化工作。
建構函式名字和類名一樣,沒有返回值,可以過載。可以有多個建構函式,如果沒有就自動生成乙個預設的建構函式,但是它什麼也不做。
自動生成的建構函式是乙個沒有引數的建構函式。但凡自己已經寫了乙個建構函式,都不會自動生成無參的建構函式。不論是程式設計師自己寫的無參建構函式還是自動生成的無參建構函式,只要是無參建構函式,就稱為預設建構函式。那麼,考慮下面一種情況:程式設計師只寫了有參的建構函式,這種情況下就不存在預設建構函式。所以預設建構函式不一定存在,或者說無參的建構函式不一定存在。為什麼要強調無參的建構函式不一定存在,有沒有哪種建構函式一定是存在的呢?複製建構函式是一定存在的,在後文介紹。
物件在生成的時候一定會呼叫某個建構函式初始化,而物件一旦生成,就再也不會在其上呼叫建構函式。
建構函式是負責記憶體的分配嗎?不是的,它只負責初始化。所以建立乙個物件的過程是,先記憶體分配(在堆或棧上),之後在分配好的記憶體上呼叫建構函式。
像 int a[3] = ; 這樣的語句就實現了陣列的初始化。如何給乙個物件陣列初始化呢,可以使用類似的方法。
1class
cnum
7 cnum(int a)
8 cnum(int a, int b)
9 }
可以這樣呼叫:
1 cnum n1[3]; //呼叫了三次無參建構函式,結果是
2 cnum n2[3] = ; //
呼叫了三次cnum(int a),結果是
3 cnum n3[3] = ; //
呼叫了兩次cnum(int a),和一次無參建構函式,結果是
4 cnum n4[3] = ; //
呼叫了一次無參建構函式和兩次cnum(int a, int b),結果是
想在堆上生成陣列可以這樣:
1 cnum * ptrnum[3] = ;
這樣生成的實際上是乙個指標陣列,前兩個元素指向的物件使用了cnum(int a, int b)初始化,第三個元素沒有初始化,是乙個野指標(請避免這樣做)。所以這乙個語句實際上呼叫了兩次建構函式。
一 建構函式(C )
內容參考於 21天學通c 第八版 不去糾結c 的原理和細節,從c的角度去學習c 再通過c 專案去加深理解 1.示例1 建構函式是可以過載 include include using namespace std class human human string humansname,int human...
C (一) 建構函式與拷貝建構函式
2.拷貝建構函式 類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫做建構函式。建構函式的任務是初始化類物件的資料成員。tip 建構函式不能宣告為const的。形式1 person 不帶任何引數,合成的預設建構函式就是該形式 合成預設建構函式初始化規則 1 如果存在類內的初始值,用它...
C 之建構函式 一
建構函式是類的乙個特殊的成員函式,它與類名同名。當定義該類的物件時,建構函式將被系統自動呼叫用以實現對該物件的初始化。建構函式不能有返回值,因而不能指定包括void在內的任何返回值型別。建構函式的定義域其他函式的定義一樣,可以放在類內或類外。與建構函式相對應的是析構函式,當撤銷類物件時,析構函式 儲...