C++基礎教程面向物件(學習筆記(42))
綜合測驗
在本章中,我們瞭解了兩個物件之間的一些不同型別的關係。
Summary
從較簡單的物件構建複雜物件的過程稱為物件組合。物件組合有兩種型別:組合和聚合。
當類的成員與類具有部分關係時,就存在組合。在組合關係中,類管理成員的存在。要符合寫作要求,物件和部件必須具有以下關係:
部件(成員)是物件(類)的一部分 部件(成員)一次只能屬於一個物件(類) 部分(成員)的存在由物件(類)管理 部分(成員)不知道物件(類)的存在
組合通常通過普通成員變數實現,或者通過指標管理所有記憶體分配和釋放來實現。如果可以將類實現為組合,則應將類實現為組合。
當類與成員具有has-a關係時,存在聚合。在聚合關係中,類不管理成員的存在。要符合聚合條件,物件及其部件必須具有以下關係:
部件(成員)是物件(類)的一部分 部件(成員)一次可以屬於多個物件(類) 部分(部件)並沒有,它的存在由所述物件(類)管理的 部分(成員)不知道物件(類)的存在 聚合通常通過指標或引用來實現。
關聯是一種更鬆散的關係型別,其中類use - a不相關的物件。要符合關聯條件,物件和關聯物件必須具有以下關係:
關聯物件(成員)與物件(類)無關 關聯物件(成員)一次可以屬於多個物件(類) 關聯的物件(部件)不知道它的存在由物件管理的(類)的 關聯物件(成員)可能知道也可能不知道物件(類)的存在 關聯可以通過指標或引用實現,或者通過更間接的方式實現(例如儲存關聯物件的索引或鍵)。
在依賴中,一個類使用另一個類來執行任務。依賴類通常不是使用它的類的成員,而是臨時建立,使用,然後銷燬,或從外部源傳遞到成員函式。
在容器類中,一個類提供一個容器來容納另一種型別的多個物件。值容器是儲存它保持所述物件的副本的組合物。參考容器是儲存指標或引用所述容器外的物件的集合。
std :: initializer_list可用於實現建構函式,賦值運算子和其他接受列表初始化引數的函式。std :: initailizer_list位於<initializer_list>標頭中。
物件關係 | 組成 | 聚合 | 關聯 | 依賴 |
---|---|---|---|---|
關係型別 | 整體/部分 | 整體/部分 | 無關 | 無關 |
成員可以屬於多個類 | 沒有 | 是 | 是 | 是 |
成員存在由類管理 | 是 | 沒有 | 沒有 | 是 |
方向性 | 單向 | 單向 | 單向或雙向 | 單向 |
關係動詞 | 部分 | 有 | 使用 | 依賴於 |
Quiz Time
本章非常簡單,比以前的章節更抽象,因此這個測驗將簡短而重要。
1)以下描述了什麼型別的關係(組合,聚合,關聯或依賴)? 1a)包含動物型別(列舉)和名稱(字串)的Animal類。 解決方案 組成 - 動物型別和名稱在動物之外沒有用途。 1b)帶有save()函式的文字編輯器類,它接受File物件。save()函式將編輯器的內容寫入磁碟。 解決方案 依賴關係 - 文字編輯器類使用File物件執行儲存到磁碟的任務。 1c)冒險家類,可以攜帶各種物品,如劍,魔杖,藥水或法術書。這些物品可以被其他冒險者丟棄和拾取。 解決方案 聚合 - 當專案與冒險者相關聯時,冒險者擁有它們。當時任何人都不能使用冒險者使用的劍。但冒險家並沒有管理物品的存在。 1d)程式設計師使用計算機在網際網路上觀看貓視訊。 解決方案 關聯 - 程式設計師和計算機是不相關的,除非程式設計師使用計算機觀看小貓在Roombas上騎行。 1e)包含CPU類的Computer類。可以從計算機中刪除CPU並自行測試。 解決方案 聚合 - 計算機有一個CPU,但不管理它的存在。 2)選擇一個:如果你可以使用(組合,聚合,關聯或依賴)設計一個類,那麼你應該。 解決方案 組成