第23章总结
本节阅读量:在本章中,我们学习了一些两个对象之间的的关系。
从简单对象构建复杂对象的过程称为对象组合。有两种类型的对象组合:组合和聚合。
当类的成员与该类有部分与整体关系时,就存在组合关系。在组合关系中,类管理成员的存在。要符合组合的条件,对象和部分必须具有以下关系:
- 部件(成员)是对象(类)的一部分
- 部件(成员)一次只能属于一个对象(类)
- 部件(成员)的存在由对象(类)管理
- 部件(成员)不知道对象(类)的存在
组合一般通过普通的成员变量来实现。或者如果类其成员变量是指针,则需要托管对应的内存分配和销毁。如果可以将类实现为组合,则应该优先实现为组合。
当类与成员是“有一个”关系时,存在聚合关系。在聚合关系中,类不管理成员的存在。要符合聚合的条件,对象及其部分必须具有以下关系:
- 部件(成员)是对象(类)的一部分
- 部件(成员)可以同时属于多个对象(类)
- 部件(成员)的存在不由对象(类)管理
- 部件(成员)不知道对象(类)的存在
聚合关系通常通过指针或引用来实现。
关联是一种更松散的关系类型,在关联关系中,类使用其他不相关的对象。要符合关联的条件,对象和关联对象必须具有以下关系:
- 被关联的对象(成员)与当前对象(类)无整体/部分的关系
- 被关联的对象(成员)可以同时属于多个对象(类)
- 被关联的对象(成员)的生命周期不被当前对象(类)管理
- 被关联的对象(成员)可能也可能不知道当前对象(类)的存在
关联关系通常通过指针或引用的方式实现,或者更加间接的一些手段(例如存储数组中的位置等)。
在依赖类型中,一个类使用其它类来完成任务。但是这两个类之间通常互相不是对方的成员,被依赖的类一般都是临时创建,使用以及销毁,或者从其它外部来源传入到当前函数中。
在容器类中,一个类提供了一个容器来容纳另一类型的多个对象。值容器是一种组合关系,用于存储它所持有的对象的拷贝。引用容器是一种聚合关系,它存储指向容器外部的对象的指针或引用。
std::initializer_list 被用来实现构造函数, 赋值运算符, 以及其它函数, 用来接收初始化列表。 std::initializer_list 位于 <initializer_list> 头文件中。
属性 | 组合 | 聚合 | 关联 | 依赖 |
---|---|---|---|---|
关系类型 | 部分-整体 | 部分-整体 | 相互关联 | 依赖 |
成员可以属于多个类 | 否 | 是 | 是 | 是 |
成员生命周期由类管理 | 是 | 否 | 否 | 否 |
关系指向 | 单向 | 单向 | 单向或双向 | 单向 |
关系术语 | 一部分 | 有一个 | 使用一个 | 依赖于 |
