九 構造與析構

2021-07-05 15:02:28 字數 1951 閱讀 5013

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中的...