面向過程程式設計:
關注是問題解決的過程步驟(事情是如何解決的),演算法。
物件導向程式設計:
關注的是誰能解決問題(類),需要什麼樣的資料(成員變數),具備什麼樣的技能(成員函式)才能解決問題。
抽象:
找出乙個能夠解決問題的"物件"(觀察研究物件),找出解決所必須的資料(屬性)、功能(成員函式)。
封裝: 把抽象的結構,歸結為乙個類(資料型別),然後例項化出類物件,設定物件的屬性,呼叫物件的功能達到解決問題的目的。
繼承: 在解決問題先,先尋找之前的類能不解決問題,或解決部分問題,如果可以則把舊的型別繼承後再次拓展,來縮短解決問題的時間,降低解決問題的難度。
多型: 物件的多種形態,外部看到個物件,然後向物件發出指令,物件會根據自身情況情況做出獨特反應。
一、類和物件
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 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函式 顯式的初始化類的成員 而沒使用初始化列表的建構函...