组合(Composition) 和 聚合(Aggregation) 是面向对象编程中的两种常见关系,它们都表示“整体-部分”或“拥有”的关系,但在语义和实现方式上有所不同。理解这两者有助于更好地设计类之间的关系和结构。
#include
class Engine {
public:
Engine() {
std::cout << "Engine created" << std::endl;
}
~Engine() {
std::cout << "Engine destroyed" << std::endl;
}
};
class Car {
private:
Engine engine; // Engine 是 Car 的一部分
public:
Car() {
std::cout << "Car created" << std::endl;
}
~Car() {
std::cout << "Car destroyed" << std::endl;
}
};
int main() {
Car myCar; // 当 Car 对象创建时,Engine 对象也会创建
return 0; // 当 Car 对象销毁时,Engine 对象也会销毁
}
解释:
Car
类中包含了一个 Engine
对象,表示组合关系。Car
对象创建时,Engine
对象也随之创建;当 Car
对象销毁时,Engine
对象也随之销毁。这表明 Engine
对象的生命周期完全依赖于 Car
对象。#include
class Engine {
public:
Engine() {
std::cout << "Engine created" << std::endl;
}
~Engine() {
std::cout << "Engine destroyed" << std::endl;
}
};
class Car {
private:
Engine* engine; // Engine 通过指针被 Car 引用,表示聚合关系
public:
Car(Engine* eng) : engine(eng) {
std::cout << "Car created" << std::endl;
}
~Car() {
std::cout << "Car destroyed" << std::endl;
}
};
int main() {
Engine* myEngine = new Engine(); // Engine 独立创建
Car myCar(myEngine); // Car 使用外部的 Engine 对象
delete myEngine; // 手动销毁 Engine 对象
return 0;
}
解释:
Engine
对象是独立创建的,Car
类通过指针引用这个 Engine
对象,表示聚合关系。Engine
对象的生命周期不依赖于 Car
对象,哪怕 Car
对象销毁了,Engine
对象仍然可以存在或被其他对象使用。生命周期依赖性:
所有权:
实现方式:
使用组合:
Person
类和 Heart
类,Heart
是 Person
的一部分,不能独立存在。使用聚合:
Library
类和 Book
类,Book
可以独立存在,并且可以属于不同的 Library
对象。组合和聚合都是表示类之间“整体-部分”关系的概念。组合强调部分对象依赖于整体对象,而聚合则允许部分对象独立于整体对象存在。在设计类之间的关系时,根据需求选择使用组合或聚合,可以帮助构建更清晰、逻辑更合理的系统。