level 6
西安恩仪联教育
楼主
一、类之间聚合关系
1、聚合关系使用实线加空心菱形表示。聚合用来表示集体与个体之间的关联关系。
2、班级与学生之间存在聚合关系,雁群和大雁之间存在聚合关系。
3、聚合关系在代码上与关联关系表现一致,类Student将成为类Classes的成员变量。
4、案例程序:
#include <iostream>
#include <string>
using namespace std;
class Tire{
private:
string brand;
public:
Tire(string b):brand(b){}
string getBrand(){return brand;}
};
class car{
private:
string model;
Tire *tires[4];
public:
car(string m,Tire *t1,Tire *t2,Tire *t3,Tire *t4):model(m){
tires[0] = t1;
tires[1] = t2;
tires[2] = t3;
tires[3] = t4;
}
void showInfo(){
cout<<"车型"<<model<<endl;
cout<<"轮胎品牌";
for(int i = 0;i < 4;i++)
{
cout<<tires[i]->getBrand()<<" ";
}
}
~car(){}
};
int main()
{
Tire t1("米其林"),t2("米其林"),t3("米其林"),t4("备胎-韩泰");
car obj("特斯拉model3",&t1,&t2,&t3,&t4);
obj.showInfo();
return 0;
}
· 聚合的核心是 “部分可独立于整体”,因此汽车的析构函数不负责销毁轮胎(轮胎由创建者管理)。
· 用指针引用轮胎对象,而非在汽车内部创建,体现 “部分独立” 的特性。
二、类之间组合关系(复合关系)
1、复合关系使用实线加实心菱形表示。组合又叫复合,用来表示个体与组成部分之间的关联关系。
2、例如学生与心脏之间是复合关系,鸟和翅膀之间关系是复合关系,心脏不能脱离人体独立存在(心脏销毁则人体也销毁,反之亦然)。
3、组合关系在代码上与关联关系表现一致,类Heart将成为类Student的成
员变量
class Heart;
class Student{
public:
Heart* heart;
Student(){
heart=new Heart;
}
~Student(){
delete heart;
}
};
4、案例展示:
#include <iostream>
#include <string>
using namespace std;
class Heart{
public:
Heart(){cout<<"心脏已创建"<<endl;}
~Heart(){cout<<"心脏已销毁"<<endl;}
void beat(){cout<<"心脏在跳动..."<<endl;}
};
class Person{
private:
string name;
Heart heart;
public:
Person(string n):name(n),heart(){
cout<<name<<"的身体已创建"<<endl;
}
~Person(){
cout<<name<<"的身体已销毁"<<endl;
}
void live(){
cout<<name<<"活着:";
heart.beat();
}
};
int main()
{
Person p1("mike");
p1.live();
return 0;
}
5、总结:
(1)组合的核心是 “部分依赖整体”,因此在 Person 类中直接定义 Heart 对象(而非指针)。
(2)当 Person 对象创建时,Heart 对象自动构造;Person 对象销毁时,Heart 对象自动析构,体现 “同生共死”。
(3)关联关系:弱依赖,类之间相互独立(如老师和学生),常用指针 / 引用实现,析构不负责对方的销毁。
聚合关系:整体 - 部分(可分离),如汽车和轮胎,部分对象可独立存在,整体析构不销毁部分。
组合关系:强整体 - 部分(不可分离),如人和心脏,部分对象随整体创建 / 销毁,直接在整体类中定义部分对象。
这三种关系的核心区别在于对象的生命周期是否绑定:关联完全独立,聚合部分独立,组合完全绑定。
2026年03月03日 04点03分
1
1、聚合关系使用实线加空心菱形表示。聚合用来表示集体与个体之间的关联关系。
2、班级与学生之间存在聚合关系,雁群和大雁之间存在聚合关系。
3、聚合关系在代码上与关联关系表现一致,类Student将成为类Classes的成员变量。
4、案例程序:
#include <iostream>
#include <string>
using namespace std;
class Tire{
private:
string brand;
public:
Tire(string b):brand(b){}
string getBrand(){return brand;}
};
class car{
private:
string model;
Tire *tires[4];
public:
car(string m,Tire *t1,Tire *t2,Tire *t3,Tire *t4):model(m){
tires[0] = t1;
tires[1] = t2;
tires[2] = t3;
tires[3] = t4;
}
void showInfo(){
cout<<"车型"<<model<<endl;
cout<<"轮胎品牌";
for(int i = 0;i < 4;i++)
{
cout<<tires[i]->getBrand()<<" ";
}
}
~car(){}
};
int main()
{
Tire t1("米其林"),t2("米其林"),t3("米其林"),t4("备胎-韩泰");
car obj("特斯拉model3",&t1,&t2,&t3,&t4);
obj.showInfo();
return 0;
}
· 聚合的核心是 “部分可独立于整体”,因此汽车的析构函数不负责销毁轮胎(轮胎由创建者管理)。
· 用指针引用轮胎对象,而非在汽车内部创建,体现 “部分独立” 的特性。
二、类之间组合关系(复合关系)
1、复合关系使用实线加实心菱形表示。组合又叫复合,用来表示个体与组成部分之间的关联关系。
2、例如学生与心脏之间是复合关系,鸟和翅膀之间关系是复合关系,心脏不能脱离人体独立存在(心脏销毁则人体也销毁,反之亦然)。
3、组合关系在代码上与关联关系表现一致,类Heart将成为类Student的成
员变量
class Heart;
class Student{
public:
Heart* heart;
Student(){
heart=new Heart;
}
~Student(){
delete heart;
}
};
4、案例展示:
#include <iostream>
#include <string>
using namespace std;
class Heart{
public:
Heart(){cout<<"心脏已创建"<<endl;}
~Heart(){cout<<"心脏已销毁"<<endl;}
void beat(){cout<<"心脏在跳动..."<<endl;}
};
class Person{
private:
string name;
Heart heart;
public:
Person(string n):name(n),heart(){
cout<<name<<"的身体已创建"<<endl;
}
~Person(){
cout<<name<<"的身体已销毁"<<endl;
}
void live(){
cout<<name<<"活着:";
heart.beat();
}
};
int main()
{
Person p1("mike");
p1.live();
return 0;
}
5、总结:
(1)组合的核心是 “部分依赖整体”,因此在 Person 类中直接定义 Heart 对象(而非指针)。
(2)当 Person 对象创建时,Heart 对象自动构造;Person 对象销毁时,Heart 对象自动析构,体现 “同生共死”。
(3)关联关系:弱依赖,类之间相互独立(如老师和学生),常用指针 / 引用实现,析构不负责对方的销毁。
聚合关系:整体 - 部分(可分离),如汽车和轮胎,部分对象可独立存在,整体析构不销毁部分。
组合关系:强整体 - 部分(不可分离),如人和心脏,部分对象随整体创建 / 销毁,直接在整体类中定义部分对象。
这三种关系的核心区别在于对象的生命周期是否绑定:关联完全独立,聚合部分独立,组合完全绑定。