C 類 物件 建構函式 初始化列表

2021-09-26 06:10:19 字數 3299 閱讀 7958

面向過程程式設計:

關注是問題解決的過程步驟(事情是如何解決的),演算法。
物件導向程式設計:

關注的是誰能解決問題(類),需要什麼樣的資料(成員變數),具備什麼樣的技能(成員函式)才能解決問題。

抽象:

找出乙個能夠解決問題的"物件"(觀察研究物件),找出解決所必須的資料(屬性)、功能(成員函式)。

封裝: 把抽象的結構,歸結為乙個類(資料型別),然後例項化出類物件,設定物件的屬性,呼叫物件的功能達到解決問題的目的。

繼承: 在解決問題先,先尋找之前的類能不解決問題,或解決部分問題,如果可以則把舊的型別繼承後再次拓展,來縮短解決問題的時間,降低解決問題的難度。

多型: 物件的多種形態,外部看到個物件,然後向物件發出指令,物件會根據自身情況情況做出獨特反應。

一、類和物件

1、通過分析"物件"的屬性和行為設計出乙個類。

2、類就是資料型別

簡單型別:只能表示乙個屬性(變數),c/c++內建資料型別

陣列型別:可以表示多個屬性(變數),型別必須相同。

結構型別:可以表示多個屬性(變數),但缺少行為(函式)。

類型別:既能表示屬性,也能表示行為,一種復合資料型別。

3、物件就類這種資料型別建立出的例項,相當於結構變數。

class student

;student stu;

二、類的定義與例項化

1、類的一般形式

class 類名 : 繼承方式 父類

// 析構函式

~類名(void) };

2、類的訪問控制限定符

public:公有成員,在任何位置都可以訪問

private:私有成員,只能類(自己)的成員函式中訪問

protected:受保護成員,只能在類(自己)和子類中訪問

注意: 類中的成員變數、成員函式預設是 private,結構中的成員變數、成員函式預設是 public。

c++中類和結構的區別只有成員函式和成員變數預設訪問許可權不同。

3、建構函式

(1)什麼是建構函式:類的同名函式就是建構函式,沒有返回值。

(2)什麼時候呼叫,誰呼叫,呼叫幾次?

建立型別物件時會被自己呼叫(每建立乙個類物件就會呼叫一次),物件整個生命週期中一定會被呼叫一次,只能被呼叫一次。

(3)負責幹什麼

成員變數的初始化,分配相關資源,設定物件的初始狀態。

class 類名 : 繼承方式 父類

};(4)物件的建立過程

a、分配型別所需要空間,無論棧還是堆。

b、傳遞實參呼叫建構函式,完成如下任務:

a、根據繼承表依次呼叫父類的建構函式。

b、根據成員變數的順序依次呼叫成員變數的構建函式。

c、執行建構函式體中的**。

注意:執行構建函式的**是整個建構函式的最後一步,

要保證建構函式**所需要的一切資源和先決條件在該**執行前已經準備充分,並得到正確的初始化。

(5)物件的建立方法

在棧上建立:類名 物件; // 不需要括號

類名 物件(實參);

在堆上建立:類名* 物件指標 = new 類名;

類名* 物件指標 = new 類名(實參);

建立多個物件:

類名 物件 = ;

類名* 物件指標 = new 類名[n];

注意: 通過malloc建立的類物件不能呼叫建構函式。

通過new建立的物件,一定要通過delete釋放。

(6)類的宣告、實現、呼叫

a、在標頭檔案中宣告

class 類名 : 繼承方式 父類

; b、原始檔實現類的相關函式

返回值 類名::函式名(引數列表)

c、呼叫時只需要匯入標頭檔案,然後與類函式所在的原始檔一起編譯即可。

注意: 如果乙個類內容不多,可以考慮在標頭檔案完全實現。也可以只在標頭檔案實現一些簡單和成員函式。

類中自動生成的函式,在原始檔中實現時,也需要在標頭檔案中宣告。

三、建構函式與初始化列表

1、建構函式可以被過載(同乙個名字的函式有多個不同版本)

2、預設構造是編譯器自動生成的乙個什麼都不做的建構函式(唯一的作用就避免統錯誤)。

注意:當類實現乙個預設構造後,預設構造就不會再自動生成,如果有需要必須顯式地寫出來。

3、無參構造未必無參,當給有參構造的所有引數設定預設形參,呼叫這種建構函式就不需要傳參。

注意:所謂的"編譯器生成的某某函式"其實不是真正語法意義上的函式,而是功能意義的函式,

編譯器作為可執行指令的生成者,它會直接生成具有某項功能的二進位制指令,不需要借助高階

語言語義上的函式完成此任務。

注意:如果乙個類a是其它類b成員變數,那麼一定要保證它有乙個無參構造,當b的建構函式

執行時會先執行成員變數的無參構造,而此時類b是無法給類a成員變數提供引數的。

4、單參構造與型別轉換

如果建構函式的引數只有乙個,那麼test t = n語句就不會出錯,它會自動呼叫單參構造來達到

型別轉換的效果。

如果想禁止這種型別轉換需要在單參構造前加 explicit

5、初始化列表

為型別員進行初始化用的。

建構函式(引數):成員1(引數1),成員2(引數2)....

通過初始化列表可以類成員變數傳遞引數,以此呼叫類成員的有參構造。

初始化列表也可以給 const 成員、引用成員進行初始化。

成員的初始化順序與初始化列表沒有關係,而是在類中的定義順序有關。

注意:初始化列表執行類成員變數還沒有定義成功。

四、析構函式

1. 特殊的成員函式

函式名必須是

~類名(void)

沒有引數 沒有返回值、不能過載

2. 誰來呼叫

析構函式會在銷毀物件時自動呼叫,在物件的整個生命週期內最多被呼叫一次。

3. 析構函式負責什麼

析構函式負責釋放在建構函式期間所獲取到的所有資源,它的執行過程:

1. 先執行析構函式本身**

2. 呼叫成員類的析構函式

3. 呼叫父類的析構函式

4. 預設的析構函式

如果乙個類沒有實現析構函式,編譯器會自動生成乙個具有析構函式功能的二進位制指令,

它負責釋放編譯器能夠看得到的資源(成員變數、類成員、父類成員),這就是預設析構。

如果乙個類沒有動態資源,也不需要做善後工作,預設析構就完全夠用了,不需要在實現新的析構函式。

注意:預設析構無法釋放動態資源(堆記憶體)

C 類建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 你可能以為上面的 將會首先做m y i,然後做m x m y,最後它們有相同的值。但是編譯器先初始化m x,然後是m y,因為它們是按這樣的順序宣告的。結果是m x將有乙個不可 的值。...

C 類建構函式初始化列表

在使用c 程式設計的過程當中,常常需要對類成員進行初始化,通常的方法有兩種 第一種方法 1.cmyclass csomeclass 2.第二種方法 1.csomeclass csomeclass x 0 y 1 2.本文將要 這兩種方法的異同以及如何使用這兩種方法。從技術上說,第二種方法比較好,但是...

C 類建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函式 顯式的初始化類的成員 而沒使用初始化列表的建構函...