「C/C++」C++类与类的关系(UML类图+代码说明)

在这里插入图片描述

✨博客主页:何曾参静谧的博客
📌文章专栏:「C/C++」C/C++学习


相关术语

在这里插入图片描述

🎯依赖关系(Dependency):表示一个类的实现需要另一个类的协助,虚线+箭头,箭头指向被依赖的类。
🎯关联关系(Association):表示两个类之间具有某种联系,实线+实心箭头,箭头指向被关联的类。
🎯聚合关系(Aggregation):表示整体与部分之间的关系,空心菱形+实线,箭头指向整体。
🎯组合关系(Composition):表示整体与部分之间的强关系,实心菱形+实线,箭头指向整体。
🎯泛化关系(Generalization):表示一般与特殊之间的关系,实线+空心三角箭头,箭头指向父类。
🎯实现关系(Implementation):表示接口与实现类之间的关系,虚线+空心三角箭头的虚线,箭头指向接口。

在这里插入图片描述

类的结构

类元素主要由类名、属性和方法三部分构成,如下所示:

-   表示private
+   表示public
#   表示protected

其中,属性表示为:

属性名:类型
方法表示为:
方法名(参数类型):返回值类型 

依赖关系(Dependency)

在C++中,一个类可以依赖于另一个类,这意味着它使用了另一个类的成员函数或数据成员。在这种情况下,被依赖的类通常被称为“依赖类”,而依赖于它的类则被称为“客户类”。

UML类图
在这里插入图片描述

代码示例

class Point {
public:Point(int x, int y);int getX() const;int getY() const;
private:int m_x;int m_y;
};class Line {
public:Line(Point start, Point end) : m_start(start), m_end(end) {}//构造函数初始化Point getStart() const {return m_start;}Point getEnd() const {return m_end;}
private:Point m_start;Point m_end;
};

关联关系(Association)

关联关系是一种表示类与类之间关系的方式,它表示两个类之间有相互关联的关系。在C++中,关联关系通常通过成员变量来实现。

UML类图
在这里插入图片描述

代码示例

在这个例子中,Class类包含一个成员变量students,它是一个存储Student对象指针的vector容器。
通过addStudent()方法,我们可以向班级中添加学生,而通过getStudents()方法,我们可以获取班级中的所有学生。

//例如,我们定义一个类Student和一个类Class,它们之间有一个关联关系,即一个班级包含多个学生:
class Student {
private:string m_name;
public:Student(string name) : m_name(name) {}string getName() {return m_name;}
};class Class {
private:vector<Student> m_students;
public:void addStudent(Student& student) {m_students.push_back(student);}vector<Student> getStudents() {return m_students;}
};

聚合关系(Aggregation)

聚合关系是一种表示类与类之间关系的方式,它表示整体和部分之间的关系。在C++中,聚合关系通常通过成员变量来实现。(部分可以离开整体,可以独立存在)

UML类图
在这里插入图片描述

代码示例

//定义一个类Car和一个类Engine,它们之间有一个聚合关系,即汽车包含一个引擎:
class Engine {
public:void start() {cout << "Engine is starting" << endl;}
};class Car {
private:Engine* engine;
public:Car(Engine* engine) : engine(engine) {}void start() {engine->start();cout << "Car is starting" << endl;}
};
//在这个例子中,Car类包含一个成员变量engine,它是一个指向Engine对象的指针。
//通过Car类的start()方法,我们可以启动汽车,其中会调用Engine类的start()方法来启动引擎。

组合关系(Composition)

组合关系是一种表示类与类之间关系的方式,它和聚合关系类似,但更加强调整体和部分之间的依赖关系。在C++中,组合关系通常通过成员变量来实现。(部分不能单独存在)

UML类图
在这里插入图片描述

代码示例

House类包含一个成员变量rooms,它是一个Room对象的数组。通过House类的openWindow()方法,我们可以打开房间中的窗户。

//定义一个Room类
class Room {
public:void openWindow() {cout << "Window is opened" << endl;}
};
//我们定义一个类House,类内包含三个Room属性
class House {
private:Room rooms[3];
public:void openWindow(int i) {rooms[i].openWindow();}
};
//它们之间有一个组合关系,即一个房屋由多个房间组成:

泛化关系(Generalization)

泛化关系是一种继承关系,表示一个类是另一个类的一般化描述。在C++中,使用关键字"public"来表示泛化关系。例如,我们有一个基类Animal,它有两个子类Dog和Cat。我们可以将Dog和Cat类声明为公共继承Animal类,如下所示:

UML类图
在这里插入图片描述

代码示例

class Animal {
public:void eat();void sleep();
};class Dog : public Animal {
public:void bark();
};class Cat : public Animal {
public:void meow();
};

实现关系(Realization)

实现关系是一种表示类与类之间关系的方式,它表示一个类实现了一个或多个接口。接口定义了一组规范,实现类必须按照这些规范来实现自己的方法。

UML类图
在这里插入图片描述

代码示例

//定义一个类Runnable,并定义了一个方法run():
class Runnable {
public:virtual void run() = 0;//纯虚函数
};//然后定义一个类Person,它实现了Runnable里面的run()接口:
class Person : public Runnable {
public:void run() {cout << "Person is running" << endl;}
};
//在这个例子中,Person类实现了Runnable接口,并实现了其中的方法run()。
//这样,我们就可以通过Person类来实现对Runnable接口的使用。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简要介绍 | 基于Diffusion model的图像生成和重建

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于Diffusion model的图像生成和重建进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 基于Diffusion model的图像生成和重建 What are Stable Diffusion Models and Why are they a Step Forw…

泰坦尼克号幸存者预测

本文所有的代码及数据均存放与https://github.com/MADMAX110/Titanic 泰坦尼克号幸存者预测挑战赛是一个非常受欢迎的机器学习实践项目。这是 Kaggle.com 上最受欢迎的比赛之一。 数据中有3个文件:train.csv&#xff0c;test.csv&#xff0c;和gender_submit .csv。 train.csv包…

小研究 - Java 指针分析综述(三)

近年来静态程序分析已成为保障软件可靠性、安全性和高效性的关键技术之一. 指针分析作为基 础程序分析技术为静态程序分析提供关于程序的一系列基础信息&#xff0c;例如程序任意变量的指向关系、变量 间的别名关系、程序调用图、堆对象的可达性等. 介绍了 Java 指针分析的重要…

【Docker】LXC所实现的隔离性、Linux Namespace等讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

volume 、namespace

顺带说一下 volume 和 namespace &#xff0c;咱们就开始分享一下 service 是什么 volume 是什么 还记得 docker 的 volume 吗&#xff0c;是一个数据卷 在 K8S 中&#xff0c;volume 是 pod 中能够被多个容器访问的共享目录 &#xff0c;实际上和 docker 是一样的 volume 是…

JMeter分布式压测,启动执行机器报错: Port already in use: 1099

Problem creating registry: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use (Bind failed) 当压测量大的时候我们有时候会失败&#xff0c;然后再接着压测&#xff0c;这样就容易造成端口…

Tauri:跨平台探索之旅

一、简介 Tauri 是一个跨平台 GUI 框架&#xff0c;与 Electron 的思想基本类似。都是属于跨平台技术的解决方案 优缺点快速分析 我们一般会把tauri作为 Electron 的替代方案&#xff0c;electron优点咱们不看&#xff0c;这里就提两个electron比较明显的问题&#xff1a; 安装…

监督学习和无监督学习

文章目录 监督学习和无监督学习监督学习算法包括无监督学习算法包括OpenCV十个子类举例&#xff1a; 监督学习和无监督学习 监督学习和无监督学习是机器学习领域中两种不同的学习范式&#xff0c;它们之间的区别在于数据的标签或标记的可用性以及学习任务的性质。 监督学习&am…

【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

前言 大家好&#xff0c;我是秋意零。 上一篇中介绍了&#xff0c;Pod 的服务对象&#xff0c;从而对 Pod 有了更深的理解&#xff1b; 今天的主题是 Pod 健康检查和恢复机制&#xff0c;我们将结束 Pod 的内容。 最近搞了一个扣扣群&#xff0c;旨在技术交流、博客互助&am…

电商数据分析方案和BI强强联合,一站式做分析

搭建一个电商大数据分析平台需要哪些条件&#xff1f;总的来说需要一套满足电商数据分析需求的方案&#xff0c;一个能够提供强大数据计算分析功能和数据可视化图表的平台&#xff0c;比如电商数据分析方案和奥威BI软件这样的组合。 电商数据分析方案BI软件&#xff0c;一站式…

CT-ICP: 带有闭环的实时且灵活鲁棒的LiDAR里程计

文章&#xff1a;CT-ICP: Real-time Elastic LiDAR Odometry with Loop Closure 作者&#xff1a;Pierre Dellenbach, Jean-Emmanuel Deschaud, Bastien Jacquet, and Francois Goulette 编辑&#xff1a;点云PCL 代码&#xff1a; https://github.com/jedeschaud/ct_icp https…

Apache RocketMQ EventBridge:构建下一代事件驱动引擎

作者&#xff1a;沈林 前言 事件驱动&#xff0c;这个词在部分人印象中&#xff0c;它是一个过时的技术——没什么新意。从时间上看&#xff0c;确实也是这样&#xff0c;上世纪 60 年代&#xff0c;事件驱动就已经被正式提出&#xff0c;经常会被在 GUI 编程中。但是在有些人…