- 何时使用组合或聚合
例
class A {
A();
~A();
private:
B* attribute;
}
此例中classA聚合/组合classB。
描述:
-
聚合
A类空钻石,用实线连接B
-
组合
A类实心钻石,用实线连接B
-
区别
以前学的讲解,组合:整体和部分的关系,部分无法脱离整体存在;聚合:也是整体和部分的关系,但是部分可以脱离整体存在。可是一直没有个明确的界线。直到搜索UML中指针的表示时看到这篇问答
https://www.codeqq.com/question/qvRrM1kv.html
使用代码中的生命周期来描述才让我明白;但是问答里可能讲的不对,毕竟学UML类图的应该都是有代码基础的,为什么老多教程要绕一圈去描述?
总结一下问答内容:组合和聚合的区别是在引用对象的生命周期上。组合中,所有者必须管理所拥有对象的生命周期,类A的对象被释放时,A中的attribute指向的B对象已经被A的函数释放,或被析构释放。聚合中,所有者不负责管理所拥有的对象的生命,类A的对象被释放时,A不会管attribute指向的B对象是否还存在。