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

news2024/11/25 4:52:46

在这里插入图片描述

✨博客主页:何曾参静谧的博客
📌文章专栏:「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.coloradmin.cn/o/702869.html

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

相关文章

基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

2023软科中国大学智能建造专业排名结果出炉(共54所高校)

智能建造专业&#xff08;Intelligent Construction&#xff09;是一个新兴的跨学科领域&#xff0c;它涉及到建筑、土木工程、计算机科学、数据科学等多个学科的知识。智能建造专业专注于研究如何利用先进的计算机技术、人工智能&#xff08;AI&#xff09;、物联网&#xff0…

进销存软件市场成熟,为什么还要用低代码构建?

关键词&#xff1a;进销存软件、群晖NAS、低代码平台 编者按&#xff1a; 进销存管理软件产业已经逐步走向成熟&#xff0c;产品种类也越来越丰富&#xff0c;也正因如此&#xff0c;企业在选择购买进销存软件的时候&#xff0c;往往不知该如何选择。不少的企业会直接选择平台型…

[golang 微服务] 8.go-micro的负载均衡操作,go Web框(Gin,Beego)调用go-micro微服务

一.先创建go-micro服务端 启动consul 需要先启动consul, consol相关内容见 [golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群 [golang 微服务] 6. GRPC微服务集群Consul集群grpc-consul-resolver案例演示 启动consul命令,这里,使用dev模式: consul agen…

手机上怎么压缩视频?教你几招手机压缩视频小技巧

压缩视频是一种有益的技术&#xff0c;可以帮助人们在存储、传输和观看视频时更有效率和便捷。尤其是在现今数字化信息时代&#xff0c;视频已经成为人们日常生活中不可或缺的一部分&#xff0c;因此更需要使用视频压缩技术来更好地管理和使用这些视频文件。下面给大家分享几种…

Yolov8优化: 多分支卷积模块RFB,扩大感受野提升小目标检测精度

1.RFB-Net介绍 论文&#xff1a;https://arxiv.org/pdf/1711.07767.pdf 代码&#xff1a;GitHub - GOATmessi7/RFBNet: Receptive Field Block Net for Accurate and Fast Object Detection, ECCV 2018 受启发于人类视觉的Receptive Fields结构&#xff0c;本文提出RFB&#xf…

3.1 C++纯虚函数

C 纯虚函数 C的纯虚函数是一种特殊的虚函数&#xff0c;没有函数体&#xff0c;只有函数原型。 纯虚函数语法格式为&#xff1a; 等号后面的 0 表示该函数为纯虚函数。 纯虚函数在抽象类中定义&#xff0c;抽象类是指包含至少一个纯虚函数的类&#xff0c;不能被实例化。 …

bim在建筑工程中的应用有哪些?

BIM以其在协同设计、冲突检测、可视化沟通、项目控制和可持续性设计等方面的应用&#xff0c;提高了建筑工程的效率、质量和可持续性&#xff0c;为各利益相关者带来了诸多益处。它已逐渐成为现代建筑工程不可或缺的重要工具和方法。BIM在建筑工程的作用越来越明显。 ​  BIM…

HOT29-删除链表的倒数第 N 个结点

leetcode原题链接&#xff1a;删除链表的倒数第 N 个结点 题目描述 删除链表的倒数第 N 个结点。 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,…

伦敦金k线图基础知识有多重要?

正所谓万丈高楼平地起&#xff0c;不积跬步无以至千里&#xff0c;在投资市场上也才如此&#xff0c;从来没有投资者能够在伦敦金市场上一蹴而就地取得成功&#xff0c;很多成功的交易者都是一步一个脚印&#xff0c;从最基础知识开始学起&#xff0c;逐渐成为专业的投资者。 看…

新星计划2023【Java基础及数据库Mysql】学习方向报名入口!

新星计划2023【Java基础及数据库Mysql】学习方向报名入口&#xff01; 一、关于本学习方向导师二、关于本学习方向官方微信群三、关于活动时间&奖品&要求四、学习计划五、TOP5评选规则六、活动要求七、注意事项 本赛道是针对那些希望从事Java开发并且想要学习如何与数据…

NVIDIA-Linux-x86_64-535.54.03.run cuda_12.2.0_535.54.03_linux.run下载地址

Official Drivers | NVIDIA Linux x64 (AMD64/EM64T) Display Driver | 535.54.03 | Linux 64-bit | NVIDIA 下载连接 Download NVIDIA, GeForce, Quadro, and Tesla DriversDownload drivers for NVIDIA graphics cards, video cards, GPU accelerators, and for other GeFor…

CAD转换PDF怎么转换?教你几种简单转换方法

CAD&#xff08;计算机辅助设计&#xff09;是一种广泛应用于工程设计和制造领域的软件。虽然CAD可以生成高质量的设计图纸&#xff0c;但是在与其他人共享这些图纸时可能会出现问题。因此&#xff0c;将CAD文件转换成PDF可以在各种设备上打开和查看。此外PDF还可以在不改变文件…

Postman设置断言

目录 前言&#xff1a; 一、断言的定义 二、Postman断言的语法 三、Postman中chai.js断言常用语法 前言&#xff1a; 在进行API测试时&#xff0c;断言是一项重要的功能。它能帮助我们验证接口的响应是否符合预期结果&#xff0c;从而确保API的正确性和可靠性。在Postman中…

Hudi 文件布局(File Layouts)

文章目录 Hudi File Layouts1 核心概念1.1 Base File1.2 Base File1.3 File Slice1.4 File Group 2. File Layouts写过程2.1 COW表2.2 MOR表 Hudi File Layouts 1 核心概念 File Layouts&#xff08;文件布局&#xff09;是指Hudi的数据文件在存储介质上的分布&#xff0c;Hu…

剑指 Offer ! ! 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 思路&…

Spring Boot 中的 @MessageMapping 注解:原理、用法与示例

Spring Boot 中的 MessageMapping 注解&#xff1a;原理、用法与示例 前言 随着 Web 技术的发展&#xff0c;越来越多的应用程序开始使用 WebSocket 协议来实现实时通信。Spring Boot 提供了对 WebSocket 的支持&#xff0c;其中 MessageMapping 注解是一个常用的注解&#x…

【Keepalived】keepalived部署

1.keepalived二进制安装【Ubuntu20.04】 (1).官网下载二进制源码包 官网&#xff1a; https://keepalived.org/download.html 下载二进制包&#xff1a; wget https://keepalived.org/software/keepalived-2.2.7.tar.gz亦可通过window本地下载并上传 (2).解压文件 [rootu…

[ISO26262]汽车功能安全第二部分:功能安全管理

Road vehicles—Functionalsafety— Part 2: Management offunctionalsafety (ISO 26262-2:2011, MOD) GB/T34590《 道路车辆 功能安全》分为以下部分: TOPS:当前所浏览位置: 随着技术日益复杂、 软件和机电一体化应用不断增加, 来自系统性失效和随机硬件失效的风险逐渐…

蓝桥杯专题-试题版含答案-【两点距离】【字符串替换】【盗梦空间】【素数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…