第一部分:有指針成員數(shù)據(jù)的類
- 概述:成員數(shù)據(jù)有指針,在設計類時需要注意拷貝構造,拷貝賦值和析構的實現(xiàn)方式
- 編譯器會生成默認的拷貝構造和拷貝賦值函數(shù),但僅僅是對指針成員的復制,這樣的構造和賦值會導致內存泄漏問題
- 三大函數(shù)
1. 析構函數(shù)
- 需要釋放指針所指向的對象
2. 深拷貝和淺拷貝
- 深拷貝:不僅拷貝指針并拷貝指針指向的內容
3. 拷貝構造函數(shù):String s2(s1)
4. 賦值構造函數(shù):String s2=s1
- 檢查是否自我賦值
- 釋放s2中指針所指向的內容
- 為s2開辟足夠大的空間
- 將s1的內容拷貝到s2中
5. String類的<<運算符重載(屬于復習內容)
- 是否可以定義成成員函數(shù)?這樣做好不好?(寫成成員函數(shù),會與傳統(tǒng)用法不一致) - 堆,棧和內存管理
1. Stack:存在于某作用域的一塊內存空間
2. Heap:又操作系統(tǒng)提供的一塊global內存空間,程序可以動態(tài)分配從中獲取若干區(qū)域
3. Stack object:在作用域中定義的變量,生存期在作用域結束之際結束,又稱為auto object
4. Static local object:生存期在作用域結束之后仍然存在,直到整個程序結束
5. global object:生存期在整個程序結束之后才結束
6. heap object
- 用new和delete開辟和釋放內存空間
- Complex類(成員函數(shù)沒有指針)的new和delete過程
- String類(成員函數(shù)沒有指針)的new和delete過程
7. static
- 靜態(tài)函數(shù),不會隱藏有this指針
- static成員數(shù)據(jù)定義,在類外
- double Account::m_rate = 8.0 (可以不賦值,也可以賦值) - 隨筆:
1. 在類函數(shù)中,可以寫明this,可以讓編譯器加this
第二部分:組合與繼承:
概述:學習了class(帶指針和不帶指針)的設計方法,可以利用類和類的各種關系解決實際問題,概況起來類和類有:
1. 復合(composition)
2. 委托(delegation)
3. 繼承(inheritance)-
復合
1. 從內存的角度解釋復合關系:如:圖1
圖1:復合的內存解釋
2. 復合關系下的構造與析構:
- 構造過程由內而外
- 析構過程由外而內 -
委托:如圖 2
1. 圖2非常有名的設計模式:handle/body 或 implement by pointer
2. String類有一個指向StringReq的指針,StringReq實現(xiàn)實際的功能,StringReq的改變不影響用戶使用String(編譯防火強,String不用重復編譯)
圖2:委托關系 -
繼承:表示is-a的關系
1. 繼承和虛函數(shù)搭配才有價值
2. 繼承的內存表示:如圖3
圖3:繼承的內存表示
3. 構造:由內而外(先父類再子類)
4. 析構:有外而內(先子類再父類) -
繼承和虛函數(shù)
1. 成員數(shù)據(jù)的繼承:從內存角度理解
2. 成員函數(shù)的繼承:從調用權理解
3. 成員函數(shù)分類:
- non-virtual函數(shù):不希望繼承類重新定義
- virtual函數(shù):希望繼承類重新定義(override),而且有默認定義
- 純虛函數(shù):希望繼承類一定要重新定義,沒有默認定義(其實可以有定義,屬于高級用法)
4. 繼承和虛函數(shù)的例子:template method設計模式,如圖4
圖4:Template method



