关联,C++使用指针实现,两者到关系最弱,并且可以两向关联,B* A::b 与 A* B::a 可以并存,两者间没有明确的ownership关系,为什么不是引用,因为引用没有办法实现相向引用,这会是一个蛋和鸡谁先的问题,A, B对象的引用类型的成员都必须要求在构造时初始化,那么两者到底谁先来后到呢? i maybe know you, but i never need to own you.

聚合,C++使用引用实现,两者(对象)间只能确定一种引用关系,与整体与部分的关系唯一确定一致,B& A::b 与 A& B::a 不并存,以B& A::b为例,A在构造时必须要确定b成员的引用,也就是必须有一个B对象先于A对象构造,A对象构造是确定对B对象的聚合关系。这样那契合聚合的关系比联强。但是由于C++不是gc管理对象回收的语言,所以必须要确保聚合的一方的生命周期不可以超过被聚合的一方。同样以 B& A::b (A聚合B)为例。A对象的生命周期不可以超过B对象的生命周期,如果B对象是一个Local对象,A对象的作用域也离不开B对象的作用域,要是B对象是一个Heap对象,就要小心管理B对象的生命周期,不要让A的生命周期超过它。i need you,but i do not own you.

组合,C++使用成员变量。构造时同构造,析构时同析构。被组合方不是来自整体的外部,整体对部分有ownership。i have you and strongly own you.

从生命周期来看,关联时大家的生命周期大家都管不着,聚合时部分的生命周期长于整体,组合时整体与部分共存亡(整体的生命周期比部分略长一点)。

上面的实现不是硬性的,只是比较好的契合语言的特点,或者说通常下比较直观的实现方式。如果全部用指针来做,例如组合,构造时new成员,析构时delete成员,又或者成员不是在构造时创建,需要在OnInit时才能创建,这样一来就得使用指针,但也不因为用了指针就影响了整体对部分的ownership,两者就马上下降为关联了。使用指针来实现组合关系,自己就得要按组合的约束做多一点功夫进行约束,确保组合的关系不走样。

C++ 中的关联,聚合,组合 以及 它们的生命周期。的更多相关文章

  1. UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  2. UML类图及依赖,泛化,关联,聚合,组合,实现

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  3. UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现(转)

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现   类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统 ...

  4. 分分钟弄明白UML中泛化 , 实现 , 关联, 聚合, 组合, 依赖

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Compo ...

  5. UML关系(泛化,实现,依赖,关联(聚合,组合))

    http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 继承.实现.依赖. ...

  6. UML 类关系图(泛化,实现,依赖,关联(聚合,组合))

    UML的构造快包含3种:  (1) 事物(4种):结构事物,行为事物,分组事物,注释事物 (2) 关系(4种):泛化关系,实现关系,依赖关系,关联关系 (3) 图(10种):用例图,类图,对象图,包图 ...

  7. UML 图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    http://www.uml.org.cn/oobject/201211231.asp 1. 关联 一个类作为另外一个类的变量:在UML类图中,用实线连接有关联关系的对象所对应的类 2.聚合 表示整体 ...

  8. Python 面向对象--继承,实现,依赖,关联,聚合,组合

    一. 继承 继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力. 举例说明: class Animal: print("吃是动物的本能") cl ...

  9. 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)

    BeanFactory和ApplicationContext Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类. Spring提供了两种不同的容器: 一种是最基本的Bean ...

  10. Unity3d中MonoBehavior默认函数的执行顺序和生命周期

    Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一次:如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数 ...

随机推荐

  1. 苹果iOS 17正式版来了:iPhone X/8系列等机型无缘

    据媒体报道,苹果会在9月13日凌晨1点发布iPhone 15系列新品,该机出厂预装iOS 17正式版系统. 在iPhone 15系列之后,苹果会向老机型推送iOS 17正式版更新.据爆料,苹果将会在9 ...

  2. CentOS7上systemctl的使用

    CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替. 1.原来的 service 命令与 s ...

  3. C++——编译和链接原理笔记

    我们在学习和开发C++程序中,理解编译和链接的原理至关重要.下面将学习一下C++程序是如何从源代码转换为可执行文件的过程,并结合示例代码进行说明.也是为了解开自己在刚学习C++的时候,编译时间长的疑惑 ...

  4. JS 这一次彻底理解插入排序

    壹 ❀ 引 在前两篇排序文章中,我们分别介绍了冒泡排序与选择排序,趁热打铁,我们接着聊插入排序.老实说,在分析排序过程中头脑很清楚,过后再尝试写出排序代码还有点坎坷...可能是我脑瓜子不太机灵的问题, ...

  5. Transform LiveData

    查询资料的其中一个场景: 创建一个回调函数,当查询后台的时候,后台有结果了,回调对应的回调函数,并将结果保存到LiveData中. public class DataModel {     ...   ...

  6. 关于php redis的geocoding函数

    在php的redis扩展官方github上,文档的最下面的确存在geocoding的函数说明.但是笔者尝试调用geoAdd函数时,返回值一直为false.就纳闷了,是使用的姿势不对,还是存在其它问题? ...

  7. 《深入理解Java虚拟机》(八) 记录一次OOM问题分析实战

    目录 一.问题分析思路 二.主要问题概述以及分析 1.相关操作 2.主要问题现象 3.初步分析问题 三.相关工具介绍 四.实际问题快照分析 1.通过Memory查看老年代内存占用情况 2.选择Live ...

  8. win32 - PeekNamedPipe的用法

    PeekNamedPipe: 将数据从命名管道或匿名管道复制到缓冲区中,而不将其从管道中删除.它还返回有关管道中数据的信息. 示例: #include <iostream> #includ ...

  9. django学习第五天---model类的属性参数,单表ORM数据库增删改查动作,查询的13个API接口

    model类的属性参数 比如:models.CharField(null=True,blank=True) (1)null 如果为True,Django将用NULL在数据库中存储空值.默认值时Fals ...

  10. Python3中的“联动”现象

    技术背景 在python中定义一个列表时,我们一定要注意其中的可变对象的原理.虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上.如果此时我们定义另外一个变 ...