章节目录

第23章总结

本节阅读量:

在本章中,我们学习了一些两个对象之间的的关系。

从简单对象构建复杂对象的过程称为对象组合。有两种类型的对象组合:组合和聚合。

当类的成员与该类有部分与整体关系时,就存在组合关系。在组合关系中,类管理成员的存在。要符合组合的条件,对象和部分必须具有以下关系:

  1. 部件(成员)是对象(类)的一部分
  2. 部件(成员)一次只能属于一个对象(类)
  3. 部件(成员)的存在由对象(类)管理
  4. 部件(成员)不知道对象(类)的存在

组合一般通过普通的成员变量来实现。或者如果类其成员变量是指针,则需要托管对应的内存分配和销毁。如果可以将类实现为组合,则应该优先实现为组合。

当类与成员是“有一个”关系时,存在聚合关系。在聚合关系中,类不管理成员的存在。要符合聚合的条件,对象及其部分必须具有以下关系:

  1. 部件(成员)是对象(类)的一部分
  2. 部件(成员)可以同时属于多个对象(类)
  3. 部件(成员)的存在不由对象(类)管理
  4. 部件(成员)不知道对象(类)的存在

聚合关系通常通过指针或引用来实现。

关联是一种更松散的关系类型,在关联关系中,类使用其他不相关的对象。要符合关联的条件,对象和关联对象必须具有以下关系:

  1. 被关联的对象(成员)与当前对象(类)无整体/部分的关系
  2. 被关联的对象(成员)可以同时属于多个对象(类)
  3. 被关联的对象(成员)的生命周期不被当前对象(类)管理
  4. 被关联的对象(成员)可能也可能不知道当前对象(类)的存在

关联关系通常通过指针或引用的方式实现,或者更加间接的一些手段(例如存储数组中的位置等)。

在依赖类型中,一个类使用其它类来完成任务。但是这两个类之间通常互相不是对方的成员,被依赖的类一般都是临时创建,使用以及销毁,或者从其它外部来源传入到当前函数中。

在容器类中,一个类提供了一个容器来容纳另一类型的多个对象。值容器是一种组合关系,用于存储它所持有的对象的拷贝。引用容器是一种聚合关系,它存储指向容器外部的对象的指针或引用。

std::initializer_list 被用来实现构造函数, 赋值运算符, 以及其它函数, 用来接收初始化列表。 std::initializer_list 位于 <initializer_list> 头文件中。

属性 组合 聚合 关联 依赖
关系类型 部分-整体 部分-整体 相互关联 依赖
成员可以属于多个类
成员生命周期由类管理
关系指向 单向 单向 单向或双向 单向
关系术语 一部分 有一个 使用一个 依赖于

23.6 std::initializer_list

上一节

24.0 继承简介

下一节