说明:组合和聚合,不是C++的语法要求,是应用中的常用手段.
组合与聚合: 需求:构建一个计算机类,一台计算机,由CPU芯片,硬盘,内存,外加一个音响.(CPU芯片也使用类来表示)
Computer.h#pragma once
#include "Cpu.h"
class VoiceBox;
class Computer{
public:
Computer(const char* cpuBrand, const char* cpuVersion,
int hardDisk, int memory);
~Computer();
void addVoiceBox(VoiceBox* box);
private:
Cpu cpu; //Computer 和Cpu 之间,就是"组合"关系
//Cpu* cpu; //指针形式的
int hardDisk;//硬盘 单位 G
int memory; //内存 单位 G
VoiceBox* box;//音响 Computer和VoiceBox之间就是聚合关系
};
Computer.cpp
#includeCpu.h#include "Computer.h" using namespace std; Computer::Computer(const char* cpuBrand, const char* cpuVersion, int hardDisk, int memory):cpu(cpuBrand,cpuVersion) { //this->cpu = Cpu(cpuBrand, cpuVersion);//不高效 this->hardDisk = hardDisk; this->memory = memory; //this->cpu = new Cpu(cpuBrand, cpuVersion);//记得在析构函数里面进行释放 cout << __FUNCTION__ << endl; //cout << cpuBrand << cpuVersion << hardDisk << memory << endl; } void Computer::addVoiceBox(VoiceBox* box) { this->box = box; } Computer::~Computer() { cout << __FUNCTION__ << endl; }
#pragma once #includeCpu.cppusing namespace std; class Cpu{ public: Cpu(const char* brand = "intel", const char* version = "i5"); ~Cpu(); private: string brand;//品牌 string version;//型号 };
#includeVoiceBox.h#include "Cpu.h" Cpu::Cpu(const char* brand, const char* version) { this->brand = brand; this->version = version; cout << __FUNCTION__ << endl; } Cpu::~Cpu() { cout << __FUNCTION__ << endl; //delete cpu; }
#pragma once
class VoiceBox{
public:
VoiceBox();
~VoiceBox();
};
VoiceBox.cpp
#include "VoiceBox.h" #includeusing namespace std; VoiceBox::VoiceBox() { cout << __FUNCTION__ << endl; } VoiceBox::~VoiceBox() { cout << __FUNCTION__ << endl; }
最后的输出结果:
说明一下:box没有进行初始化.
小结: 组合:在组合里面:被拥有的对象(芯片)的生命周期与其拥有者(计算机)的声明周期是一致的.
计算机被创建时,芯片也随之创建;
计算机被销毁时,芯片也随之销毁;
拥有者需要对被拥有者负责,是一种比较强的关系,是整体与部分的关系.
具体组合方式:1)被组合的对象直接使用成员对象->Computer.h 中直接写 Cpu cpu;
2)使用指针表示被组合的对象,在构造函数中,创建被组合的对象;在析构函数中,释放被组合的对象.(此文中没有写到,文中提到的方式较常见,推荐使用)
聚合:1)聚合不是组成关系,被包含的对象,也可能被其他对象包含.
2)拥有者不需要对被拥有的对象的生命周期负责.
今天的学习记录完毕!感谢欣赏,文章如有技术错误,欢迎大佬指正,谢谢!



