1、類型封裝
類 --> 對象
描述 : (1)屬性
(2)行為 ---屬性和行為是屬於類的
建立對象。
2、建構函式 --- 初始化對象
(1)建構函式名字必須與類名一樣
(2)建構函式不能寫傳回型別
建構函式在建立對象時,系統自動調用
建構函式允許重載,按使用者要求,適應多種情況
當類中一個建構函式都沒有的時候,系統提供預設無參的建構函式
但如果在類中定義了一個建構函式,系統就不提供預設的了,所以,建議,在寫建構函式時,都要寫一個無參的建構函式
3、對類的安全的定義
變數 -> 私人 -> private 保護變數,防止外界隨意修改,只能在類的內部使用(只能被自己的成員函數使用)
函數 -> 公有 -> public
為保證私人變數也能為外界訪問,在類內部提供set,get方法
set方法沒有傳回值,但要求有參數
get方法肯定有傳回值,沒有參數
4、定義類的步驟
(1)寫屬性的行為
成員變數 函數
(2)成員變數--> private
成員函數 --> public
(3)特殊函數
建構函式,建議寫2個。一個有參數的,一個無參的
get,set函數,一個成員變數對應一對get,set函數,是外界訪問此變數的唯一途徑
對於setXXX函數,沒有傳回值,有參數,參數的類型與被賦值的屬性類型一致。
對於getXXX函數,沒有參數,有傳回值,傳回值的類型與輸出的屬性類型一致。
類的行為
5、封裝
定義類的過程就是封裝
練習:封裝一個account類型
屬性:id , password ,name ,balance
行為:save , withdraw , query
6、把account類拆成多檔案結構
(1)方便快速探索整個類定義
(2)使用方便,包含標頭檔即可
long Account::getId(){...........}
在函數實現時,函數前把類名加上,確定函數的所有權,避免2個類中有同名的函數,編譯出錯。
" :: "稱為域存取控制符。
7、Person per ; 建立了一個對象,系統調用建構函式。
Person *p = NULL ; 聲明一個類的指標,系統是不會調用建構函式的
Person * p = NULL;
p = new Person ; 在堆中申請一個類空間
delete p;
在堆中的資料沒有名字,只能通過指標訪問類對象,訪問類的成員變數:
(*p).sayHello();
p->sayHello();
Person ps[5];聲明一個Person類型的數組,會調用5次建構函式
數組在聲明的時候,系統會為其分配空間
並且在聲明數組的時候,沒有機會指定建構函式,只會調用無參的建構函式
當一個類定義中沒有無參的建構函式,但要聲明一個類的數組時,可以聲明一個指標數組
Person *ps[5]; ---聲明指標的時候,類對象沒有建立,數組中每個元素都是Person類型的指標,達到:
(1)不用建構函式
(2)實現使用對象
for(int i = 0 ; i <5 ; i++){ ps[i] = new Person(i , 20+i); //用迴圈初始化每個指標 } for(int i = 0 ; i < 5 ; i++){ delete ps[i]; //釋放指標指向的空間 ps[i] = NULL ; }
8、課堂練習:
要求:main()函數中不能寫代碼,在運行程式時,列印“Hello World”
答案:全域變數的初始化操作在main函數執行之前就已經初始化了。因此,可以寫一個全域變數的類,其無參建構函式寫輸出語句。
然後聲明一個類的全域對象。
9、在建構函式中,當成員變數名稱和形參名稱相同,避免衝突的方法:
在每個對象內部都有一個名為this的指標,指向自己,使用自己的成員變數 this->name
10、解構函式
當對象的生命週期結束,系統要回收空間,會自動被調用
申請的所有資源(new char[20]),在解構函式中釋放
若對象是在main函數中的變數,在main函數結束之後,才會調用解構函式
若對象是一個函數中的局部變數,在函數返回時,調用解構函式
解構函式調用 : 對象生命週期結束,系統自動調用解構函式
可以把釋放資源的代碼寫在解構函式中
解構函式的寫法:建構函式前加 “~”
不能重載,不能有參數
若不寫解構函式,系統會提供預設的解構函式
當類中用到了系統空間:new記憶體,開啟檔案
就需要寫解構函式,釋放資源
11、作業:(1)利用物件導向的思想實現棧結構,並自己寫main函數測試。
(2)把原來的銀行系統改成物件導向的形式。