组合和聚合

news2024/11/17 22:22:45

不是c++的语法要求,是一种建模思想

目录

1.组合 

1. 使用 -- 在一个类中创建另外一个类的对象

代码中的解释: 

代码结果: 

组合:

 2. 使用  --  在一个类中创建另外一个类的指针

2.使用类定义一个指针 -- 不是创建一个对象

3.聚合

1. 使用 

代码中的解释: 

结果: 

聚合:

1.组合 

1. 使用 -- 在一个类中创建另外一个类的对象

就是,一个类中包含有另外一个类创建的对象。(则这两个类就是组合关系) 

根据下面代码说明组合的关系。 

// 实现创建两个类,使用类文件分离的方式
testCPU.h:
        class testCPU
        {
         public:
                // 使用指针传入字符串
	            testCPU(const char *versionCpu = "intel");
	            void setCpu(const char* versionCpu);
	            ~testCPU();
         private:
                string  versionCpu;  // CPU的类型
        };

testComputer.h:
          #include "testCPU.h" // 导入Ccpu头文件使用其构造函数

          class testComputer
           {
           public:
                // 使用指针传字符串更加的高效,并且可以直接复制给string类型
	            testComputer(const char *version="len",int memory = 64,const char*                                                                     
                versionCpu = "intel");
	            ~testComputer();
           private:
	            int memory;  // 电脑的内存大小
	            testCPU cpu;  // 在testComputer内部创建testCPU类对象
           };


testComputer.cpp:

            testComputer::testComputer(const char* version, int memory, const char* 
            versionCpu ){
	                this->cpu.setCpu(versionCpu);

	                cout << __FUNCTION__ << endl;  // 打印调用函数的名字
            }

            testComputer::~testComputer() {
	                cout << __FUNCTION__ << endl;
            }

testCPU.cpp:
            testCPU::testCPU(const char* versionCpu){
	            cout << __FUNCTION__ << endl;  // 打印函数的名字
            }

            void testCPU::setCpu(const char* versionCpu) {
	            this->versionCpu = versionCpu;
            }

            testCPU::~testCPU(){
	            cout << __FUNCTION__ << endl;  // 打印函数的名字
            }

main.cpp:
            void test() {
	                testComputer com; //使用测试函数,测试组合的规则
            }

            int main(void){

	            test();

	            system("pause");

	            return 0;
            }
代码中的解释: 

1.  当我们使用string定义字符串时,在传递参数的时候,可以使用char* 来传递一个字符串的地址,然后赋值给string类型的变量。 (更加高效)

2.  我们在Computer类中创建了一个CPU类对象。 

3. 在使用有参构造函数的时候,我们使用了默认值通过指定一个默认值,保证我们在不传递数据的情况下也可以有一个值。 (在使用默认值的情况下,我们可以不传递参数的情况下调用有参构造函数。如上面,testCpu cpu 没有使用参数,但是调用的是有参构造函数,因为我们指定了默认值--但是,有默认构造函数的时候就不能这样写了,会出错)

4. 在构造函数和析构函数中,使用__FUNCTION__宏来输出调用的函数名,用来观察组合的关系。 

代码结果: 

 

组合:

在一个类中创建另外一个类的对象 ,然后这两个类会同生共死,当包含的类创建对象时,会先创建被包含类的对象,当包含类对象死亡时,被包含的类的对象也死亡 。

就相当于,你买了一台电脑,电脑里面的cpu也一起被你买到,当你不使用这台电脑的时候,里面的cpu你也不用了。 

 2. 使用  --  在一个类中创建另外一个类的指针

这种情况, 就是在类中不创建对象,定义一个指向该类的指针。testCPU *cpu。因为定义的是指针,不会调用构造函数,所以要想实现组合就得在构造函数中,为指针开辟空间。在析构函数中释放指针的空间。

 

2.使用类定义一个指针 -- 不是创建一个对象

首先,使用类定义一个指针的时候是不会调用构造函数的。因为:它只是定义了一个指针,这个指针指向这个类型,并不表示创建了一个对象。 -- 其实指针是一个整形变量。

这就是为什么我们上面使用在类中定义另外一个类的指针的时候,需要自己在函数中实现开辟空间和释放空间。 

 

3.聚合

1. 使用 

// 实现创建两个类,使用类文件分离的方式
testCPU.h:
        class testCPU
        {
         public:
                // 使用指针传入字符串
	            testCPU(const char *versionCpu = "intel");
	            void setCpu(const char* versionCpu);
	            ~testCPU();
         private:
                string  versionCpu;  // CPU的类型
        };

testComputer.h:
        class testCPU;  // 不导入头文件,告诉编译器要使用这个类就行,(因为没有使用类中的内容,只用了类名)

        class testComputer
        {
         public:
	            testComputer(testCPU *cpu);  // 有参数的构造函数,传入指向对应类型的指针
	            void setCpu(testCPU* cpu);
	            ~testComputer();
         private:
	            testCPU *cpu;  // 定义一个指向类的指针,并不创建对象
        };

testComputer.cpp:

         testComputer::testComputer(testCPU* cpu){
	        this->cpu = cpu;
	        cout << __FUNCTION__ << endl;
         }

         testComputer::~testComputer() {
	        cout << __FUNCTION__ << endl;
         }

         void testComputer::setCpu(testCPU* cpu) {
	        this->cpu = cpu;
         }

testCPU.cpp:
            testCPU::testCPU(const char* versionCpu){
	            cout << __FUNCTION__ << endl;  // 打印函数的名字
            }

            void testCPU::setCpu(const char* versionCpu) {
	            this->versionCpu = versionCpu;
            }

            testCPU::~testCPU(){
	            cout << __FUNCTION__ << endl;  // 打印函数的名字
            }

main.cpp:
           #include "testComputer.h" 
           #include "testCPU.h"  // 因为testComputer中不包含此头文件,所以需要再此处包含头文件

           using namespace std;

           void test(testCPU* cpu) {
	            testComputer com(cpu); //使用测试函数,测试组合的规则
           }

           int main(void){
	            testCPU cpu;  // 创建一个cpu的对象

	            test(&cpu);

	            system("pause");

	            return 0;
          }
代码中的解释: 

1. 聚合的代码和组合的代码CPU那块是一样的,因为他值需要定义一个类。 

2. 我们在Computer类中定义了一个CPU类的指针,只使用到了CPU这个类的名称,并没有使用类中的内容所以我们不需要包含它的头文件,只需要写一个类的声明就行。(更高效--但是需要使用类中内容的时候,就必须得包含了,比如使用构造函数创建对象) 。 

3. 和组合不一样,聚合我们需要在主程序创建CPU类对象,所以需要包含其头文件。 

4. 我们定义了一个指向CPU类对象的指针,通过构造函数传入,就可以使用这个指针指向传进来的对象。 

结果: 

 

根据结果:看出,当Computer创建的时候,并不会创建CPU,在Computer死亡的时候,也CPU不会死亡。-- 也就是他两的生存和死亡没有关系。 

就好比:你买了一个电脑,但是里面没有CPU,但是有一个可以安装CPU的接口,你又另外买了一个CPU,安装在电脑上。当你的电脑不使用了,你的cpu还可以继续使用,你可以将它拆下来安装到别的电脑上继续使用。 

聚合:

聚合其实就是,在一个类里面定义一个别的类的指针,然后在需要的时候(可以是初始化的时候,也可以不初始化,在后面使用接口(代码中的setCPU函数)再指向),将这个类内部的指针,指向另外一个类的对象。 

所以,聚合就是,类内部有一个指针,用于指向其它类的对象。当我们需要的时候将这个指针,指向这个对象就行。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1377255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世微AP5125 输入14-80V 输出12V5A LED灯降压恒流电源驱动方案 SOT23-6

这是一款60WLED驱动方案,线路图BOM表如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 …

与建设者同行:TinTinLand 社区 2023 年度回顾

2023 是 Web3 行业不同寻常的一年&#xff0c;也是 TinTinLand 社区高速发展的一年&#xff1a;我们精心提供最有价值的内容&#xff0c;举办一系列丰富多样的活动&#xff0c;开设氛围友好的区块链技术课程&#xff0c;为尚不了解 Web3 的开发者等各领域人才&#xff0c;构建颇…

小程序必看系列!什么是抖音小程序?抖音小程序怎么制作?

随着移动互联网的飞速发展&#xff0c;抖音已经成为了一个广受欢迎的短视频平台。在这个平台上&#xff0c;用户可以分享自己的生活点滴、表达自己的观点&#xff0c;甚至还能通过小程序来丰富自己的社交体验。那么&#xff0c;如何制作抖音小程序呢&#xff1f; 一、抖音小程…

清水模板厂家专供 — 易脱模,不翘曲

在现代建筑施工中&#xff0c;清水模板的选择对于实现优质建筑表面尤为关键。我们专供的清水模板&#xff0c;凭借其易脱模和不翘曲的特性&#xff0c;为建筑项目提供了理想的解决方案。 产品特点 易脱模性能&#xff1a;我们的清水模板表面光滑细腻&#xff0c;经过特殊处理…

知识库软件有很多,这几个最好用

时代进步的同时&#xff0c;逐渐优化的企业知识库已经成为企业优化工作效率、提升企业竞争力的重要工具。随着云计算和大数据技术的快速发展&#xff0c;知识库软件如雨后春笋般出现在人们的视野中。下面&#xff0c;我从寻宝者的角度&#xff0c;向大家稳稳地推荐三款最优秀的…

电动工具直流调速专用集成电路GS069,具有电源电压范围宽、功耗小、抗干扰能力强等特性

GS069电动工具直流调速电路是CMOS专用集成电路&#xff0c;具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络&#xff0c;改变与之相接 的VMOS 管的输出&#xff0c;达到控制电动工具转速的作用。该电路输出幅值宽&#xff0c; 频率变化小&#xff0c;占空比…

SQL-DML增删改

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

利用Qt输出XML文件

使用Qt输出xml文件 void PixelConversionLibrary::generateXML() {QFile file("D:/TEST.xml");//创建xml文件if (!file.open(QIODevice::WriteOnly | QIODevice::Text))//以只写方式&#xff0c;文本模式打开文件{qDebug() << "generateXML:Failed to op…

ZigBee快速入门——IO配置(LED)

ZigBee快速入门——IO配置&#xff08;LED&#xff09; 点亮LEDIO配置 建议先看IO配置再看点亮LED 点亮LED #include <iocc2530.h> //点亮LED&#xff08;纯寄存器版&#xff09; void Delay(unsigned int n); void InitIO(void); void main(void){InitIO();while(1){P1…

redis源码之:事件驱动epoll

一、aeEventLoop初始化 从server.c的main方法中进入initServer&#xff0c;在initServer方法中&#xff0c;server.el aeCreateEventLoop(server.maxclientsCONFIG_FDSET_INCR);创建eventloop&#xff1a;&#xff08;注意fileevent与epollevent的区分fileEvent是标识往epoll…

Frida基本能力汇总

1 需求 Frida GitHub Welcome | Frida • A world-class dynamic instrumentation toolkit 2 接口 3.1 基本能力Ⅰ&#xff1a;hook参数、修改结果 3.2 基本能力Ⅱ&#xff1a;参数构造、方法重载、隐藏函数的处理 3.3 中级能力&#xff1a;远程调用 3.4 高级能力&#xff1…

部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比

部署ATS&#xff08;Apache Traffic Server&#xff09;和Nginx正向代理服务&性能对比 1. 正向代理的用途2. ATS(Apache Traffic Server)正向代理服务器部署3. Nginx正向代理服务器部署4. 性能对比 1. 正向代理的用途 正向代理一般是用于内部网络出去&#xff0c;反向代理一…

C#实现Excel合并单元格数据导入数据集

目录 功能需求 Excel与DataSet的映射关系 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 ​方法设计 返回值 参数设计 打开数据源并计算Sheets 拆分合并的单元格 创建DataTable 将单元格数据写入DataTable 总结 功能需求 将Excel里的worksheet表格导入到Da…

互联网加竞赛 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

HarmonyOS4.0系统性深入开发18公共事件简介

公共事件简介 HarmonyOS通过CES&#xff08;Common Event Service&#xff0c;公共事件服务&#xff09;为应用程序提供订阅、发布、退订公共事件的能力。 公共事件从系统角度可分为&#xff1a;系统公共事件和自定义公共事件。 系统公共事件&#xff1a;CES内部定义的公共事…

如何利用RPA做UI自动化测试对传统自动化的降维打击

写在前面 RPA软件一开始的目的并不是自动化测试&#xff0c;而是要把电脑上面几十个、上百个常用的软件&#xff0c;通过机器人流程自动化来打通&#xff0c;通过一个软件来控制几十个、上百个软件。而这个过程&#xff0c;其实覆盖了软件自动化测试。 所谓降维打击&#xff0c…

webpack初始化

1.下载 webpack webpack-cli 到项目 (版本独立) ** npm i webpack webpack-cli --save-dev ** 2.项目中运行工具命念&#xff0c;采用自定义命令的方式(局部命令)

Python商业数据挖掘实战——爬取网页并将其转为Markdown

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言前言正则表达式进行转换送书活动 前言 在信息爆炸的时代&#xff0c;互联网上的海量文字信息如同无尽的沙滩。然而&#xff0c;其中真正有价值的信息往往埋…

【源码阅读】事件订阅包v2

1、Feed Feed 实现一对多订阅&#xff0c;其中事件的载体是通道。发送到 Feed 的值会同时传送到所有订阅的通道。 与Typemux的对比 链接: link TypeMux是一个同步的事件框架&#xff0c;当有一个被订阅的事件发生的时候&#xff0c;会遍历该事件对应的订阅者通道&#xff0c;…

ZigBee快速入门——外部中断(Key)

外部中断 :::tips 理解三道锁&#xff1a;EA——IENx——PxIEN EA-总开关 IENx-中断使能功能配置&#xff0c;可以配置程总线 IO中断&#xff08;P0、P1、P2&#xff09;&#xff0c;也可以配置程定时器等中断 PxIEN-总线中具体某一位的中断允许&#xff0c;如刚刚已经配置了 I…