16.x - 小结与测试 - 对象关系
复习
16.2 - 组合关系
- 使用简单对象构建复杂对象的过程,称为对象组合。对象组合有两种:组合和聚合。
- 当一个类的类成员为该类的一部分(part-of)时,就产生了组合关系。在组合关系中,类负责管理成员是否存在。一个合格的组合关系应该满足如下条件:
- 部分(成员) 是对象(类)的一部分;
- 部分(成员) 同时只能属于一个对象(类);
- 部分(成员) 的存在与否受到对象(类)的管理;
- 部分(成员) 并不知道对象(类)是否存在。
- 通常情况下,组合关系可以使用一般的成员变量来实现,或者也可以使用指针,但其表示的内存的申请和释放必须完全由该类来管理。如果你能够将一个类实现为组合关系,那你就应该尽量这么做。
16.3 - 聚合关系
- 当某个类具有(has) 某个成员是,聚合关系就出现了。在聚合关系中,类并不负责管理该成员的存在性。一个合格的聚合关系应该满足如下条件:
- 部分(成员) 是对象(类)的一部分;
- 部分(成员) 不仅仅属于一个对象(类);
- 部分(成员) 的存在与否不会受到对象(类)的管理;
- 部分(成员) 并不知道对象(类)是否存在。
- 聚合关系通常可以通过指针和引用来实现。
16.4 - 关联关系
- 关联是一种相对更加松散的关系。类使用了一个与它并无直接关系的对象。只有满足如下条件,才能将两个对象称为关联关系:
- 关联对象(成员)与该对象(类)本不该相关;
- 关联对象(成员)可以同时属于多个对象(类);
- 关联对象(成员)存在与否不会受到对象(类)的管理;
- 关联对象(成员)对对象(或类)的存在,可能知晓也可能不知晓。
- 关联关系可以通过指针或引用来实现,也可以通过更加间接的方式实现(例如通过关联对象的对应键或索引来使用它)。
16.5 - 依赖关系
- 当一个类使用另一个类完成某项任务时,它们之间属于依赖关系。被依赖的对象通常并不是使用它的对象的一部分。被使用的对象通常是被临时创建、使用然后销毁,或者是通过成员函数传入并使用的外部资源。
16.6 - 容器类
16.7 - std::initializer_list
std::initializer_list
可以用来实现构造函数、赋值操作符和其他接受列表初始化参数的函数。 std::initailizer_list
位于<initializer_list>
头文件中。
属性类型 |
组合 |
聚合 |
关联 |
依赖 |
关系类型 |
整体/部分 |
整体/部分 |
本不相关 |
本不相关 |
成员是否可以属于多个类 |
No |
Yes |
Yes |
Yes |
成员存在与否是否受类管理 |
Yes |
No |
No |
No |
方向 |
单向 |
单向 |
单向或双向 |
单向或双向 |
关系动词 |
Part-of |
Has-a |
Uses-a |
Depends-on |