chapter9 定義新型別

2021-09-29 14:46:33 字數 1708 閱讀 6346

c++的型別分為:內部型別+自定義型別

c++的一種設計思想:應該讓程式設計師建立跟內部型別一樣易於使用的型別

乙個良好的程式設計習慣:

標頭檔案中使用限定名 (std::***),原始檔包含適當的using

類的成員函式

對於類的成員函式,總是有乙個隱含引數,就是正在由我們操作的物件

常量成員函式

示例

struct student_info ;
代表,傳遞隱含引數 student_info 時,我們把它當作乙個const常量引用,因此不能改變物件的內部狀態

注:不能對常量物件呼叫非常量函式,原因同上

非成員函式

例如 compare(object a, object b)這種就可以放在類實體的外部作為全域性函式

原則:如果函式會改變乙個物件的狀態,那麼它就應該作為這個物件的成員函式

訪問器函式

就是 get / set,決定了資料的讀寫訪問許可權

注:如果 get 的返回型別為引用,那麼外部其實也可以改它,這樣封裝就被破壞了,所以get方法盡可能不返回引用型別,而是返回值型別

struct 和 class

唯一區別是:

對內部成員的預設保護方式不同:struct預設是public,class預設是private

用途(1) 如果設計是保留結構,以指示簡單的型別,並且希望公開這些型別的資料結構 ----> 使用 struct

(2) 如果想構造乙個型別並控制對其成員的訪問 ----> 使用 class

預設初始化

物件是區域性變數,會發生預設初始化

數值初始化

發生以下三種情況時,會發生數值初始化

(1) 物件被用來初始化乙個容器元素

(2) 為對映表map新增乙個新元素

(3) 定義乙個有特定長度的容器,物件是這個容器的元素

(1) 如果物件屬於自定義型別,且定義了乙個或多個建構函式,則合適的建構函式就完全控制了對類的物件的初始化

(2) 如果物件屬於內部型別,那麼數值初始化會把它設為0,預設初始化方式會直接設為記憶體中的值

(3) 如果物件屬於自定義型別,且未定義任何建構函式,那麼會對這個物件的每乙個資料成員進行相應的數值初始化或缺省初始化

建構函式

示例

student_info::student_info(): midterm(0), final(0)

初始化步驟

(1) 分配記憶體

(2) 按照建構函式初始化程式列表(例如midterm(0)這種),對物件初始化

(3) 執行建構函式的函式體

建構函式中的初始化工作包含了顯式和隱式,例如物件中的vector雖然沒有在建構函式中涉及,但是會隱式呼叫vector的預設建構函式

對於物件中的基本型別,如果是預設初始化,那麼值就是記憶體中的隨機值

乙個好的程式設計習慣是:每乙個建構函式在退出前,都應該先保證所有的資料成員都有了有意義的值

chapter9物件導向

1.繼承 單基繼承 多基繼承 先產生基類成員,在產生派生類成員 基類中含同名成員導致的二義性 處理辦法是採用成員名限定 菱形繼承 將共同基類宣告為虛基類 2.公有繼承,私有繼承,保護繼承 基類私有成員都不能被派生類或派生類物件訪問 public繼承 派生類能訪問基類的public protect,派...

Chapter 9 模板方法模式

模板方法 template method 模式是關於類的行為模式。在乙個抽象類中定義乙個演算法的骨架,其中一些步驟和邏輯已經實現,而將另外一部分步驟和邏輯推遲到子類中去實現。模板方法模式使得子類可以在不改變演算法結果的情況下,重新定義演算法中的某些步驟。模板方法模式讓不同的子類可以用不同的方式實現抽...

深入理解計算機系統chapter9

從概念上來講 虛擬儲存器被組織為乙個存放在磁碟上的n個連續的位元組大小的單元組成的陣列。磁碟上陣列的內容被快取到主存中 1.讀寫記憶體的安全性 物理記憶體本身是不限制訪問的,任何位址都可以讀寫,而作業系統要求不同的頁面具有不同的訪問許可權,這是利用cpu模式和mmu的記憶體保護機制實現的。例如,te...