c++中的建構函式
如何給物件進行初始化?
一般而言所有的物件都需要乙個確定的初始狀態
解決方案
為每個類都提供乙個public的initialize函式
物件建立後立即呼叫initialize函式進行初始化
(插入9-1.cpp)
上述解決方案initialize只是乙個普通的函式,必須顯示的呼叫
一旦由於失誤的原因,物件沒有初始化,那麼結果將是不確定的
沒有初始化的物件,其內部成員變數的值是不確定的
(插入9-2.cpp)
c++中的類可以定義與類名相同的特殊成員函式
這種與類名相同的成員函式叫做建構函式
建構函式在定義時可以有引數,但是沒有任何返回型別的宣告
建構函式的呼叫
一般情況下c++編譯器會自動呼叫建構函式
在一些情況下則需要手動呼叫建構函式
(插入9-3.cpp)
成員函式的過載
類的成員函式和普通函式一樣可以進行過載,並遵守相同的過載規則
(插入9-4.cpp)
兩個特殊的建構函式
沒有引數的建構函式(預設建構函式)
當類中沒有定義建構函式時,編譯器預設提供乙個無參建構函式,並且其函式體為空
const引用的建構函式(拷貝建構函式)(實質是個過載的建構函式而已)
當類中沒有定義拷貝建構函式時,編譯器預設提供乙個拷貝建構函式,簡單的進行成員變數的值複製。
(插入9-5.cpp)(插入9-6.cpp)
陣列類的建立
(插入9-7.cpp)
思考:可以直接呼叫建構函式嗎?如果可以,直接呼叫建構函式會有什麼情況發生?
解答:可以直接呼叫建構函式,直接呼叫建構函式將得到乙個臨時物件
(插入10-5.cpp)
因為建構函式只能被編譯器自動或者在定義時呼叫。
c++中的類可以使用其他類定義成員變數
如何給物件成員進行初始化?
(插入10-1.cpp)
c++中提供了初始化列表對成員變數進行初始化
語法規則:
construrtor::cons ():m1(v1),m2(v2),m3(v3)
注意:成員變數的初始化順序與宣告順序相關,與在初始化列表中的順序無關
初始化列表先與建構函式的函式體執行
插曲:類中的const成員變數是肯定有被分配空間的
類中的const成員變數只是乙個唯讀變數
編譯器無法直接得到const成員變數的初始值,因此無法進入符號表成為真正意義上的常量
初始化與賦值不同
初始化是用已經存在的物件或值對正在建立的物件進行初值設定
賦值是用已經存在的物件或者只對已經存在的物件進行值設定
區別: 初始化:被初始化的物件正在建立
賦值:被賦值的物件已經存在
c++中的析構函式:
如何清理被銷毀的物件?
解決方案
為每個類提供乙個public的destroy函式
物件不在被需要時立即手工呼叫destroy函式進行清理
destroy函式只是乙個普通的函式,必須顯示的呼叫
如果物件銷毀前沒有做清理,那麼狠可能造成資源洩露
在建構函式中申請的資源,需要在物件銷毀前釋放
c++中的類可以定義乙個特殊的成員函式清理物件
這個特殊的成員函式叫做析構函式
定義:~classname()
析構函式沒有引數也沒有任何返回型別的宣告
析構函式在物件銷毀時自動呼叫
(插入10-2.cpp)
array類的進化
(插入10-3.cpp)
建構函式與析構函式的呼叫秩序
當類中有成員變數是其他類的物件時
首先呼叫成員變數的析構函式
呼叫順序與宣告順序相同
之後呼叫自身類的建構函式
析構函式的呼叫秩序與對應的構造函式呼叫秩序相反
(插入10-4.cpp)
構造與析構函式
1 建構函式 作用 建立類物件,並初始化其成員。可定義多個進行過載 注 建構函式可以有引數,無返回型別,不能是虛函式,在類體外定義時其函式名前加上 類名 可過載 若乙個類物件是另乙個類物件的資料成員,那麼在建構函式建立物件時,作為資料成員的類物件要先呼叫自身的建構函式 區域性到整體 2 析構函式 作...
Swift 構造與析構
在某些情況下系統會自動生成乙個構造器。使用構造器時注意事項。在 swift 中採用繼承式初始化方式。如果沒有在類中實現任何指定構造器,那麼將繼承父類中的所有指定構造器。父類 class transport 無引數指定構造器 init str string 子類 class car transport...
c 構造與析構
c 中還提供了一些封裝方法 構造方法 析構方法 一 在宣告乙個類的物件後,要對該物件進行初始化,即對物件中的資料成員賦值 建構函式 用於建立乙個物件,提供初始化該物件的簡單手段 函式語法 建構函式的函式名必須與類名相同 它沒有返回值 作用為初始化物件 其呼叫是在宣告物件時候自動呼叫 python中的...