C++ UML 类图介绍与设计

1 类图概述

  • UML(Unified Modeling Language),即统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。
  • UML从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。
  • 类图显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图是面向对象建模的主要组成部分,简化了人们对系统的理解。类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。

2 类图中类的表示方法

  • 介绍一个绘制类图的在线工具 draw
  • 也可以去draw官网下载安装客户端

2.1 普通类

  • 在UML类图中,类使用包含类名、属性和方法且带有分割线的矩形来表示。

  • 比如有这样一个类

    •  class Student {public:int study(std::string name);private:std::string m_name;int m_code;};
      
  • 可以如下表示
    在这里插入图片描述

  • 访问权限

    • + 表示public
    • - 表示private
    • # 表示protect
  • 属性的完整表示方式

    • 可见性 名称: 类型
  • 方法的完整表示方式

    • 可见性 名称(参数列表): 返回类型

2.2 抽象类

  • 有这样一个抽象类

    •  class Animal {public:virtual void makeSound() = 0;std::string getName() ;private:std::string m_name;};
      
  • 可以如下表示
    在这里插入图片描述

  • 抽象类类名称用斜体表示,抽象方法用斜体表示

  • 类图边框用虚线表示(建议)

3 类与类的关系

3.1 关联关系

  • 关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,比如老师和学生等。关联关系是类与类之间最常用的一种关系,一般引用的对象,会作为另外一个类的成员变量来使用。
  • 关联关系又可以分为单向关联、双向关联和自关联。

3.1.1 单向关联

  • 有以下两个类Address和Person,其中Person有一个属性为Address,这种就称为单向关联关系。
    •   // Address类class Address {public:// 获取街道信息std::string getStreet() { return m_street; }// 获取城市信息std::string getCity() { return m_city; }private:std::string m_street; // 街道信息std::string m_city; //城市信息};// Person类,其中包含一个Address对象的指针class Person {public:// 设置某人地址void setAddress(Address* address) { m_address = address; }// 获取某人姓名std::string getName() { return m_name; };// 获取某人对应地址Address* getAddress() { return m_address; };private:std::string m_name;Address* m_address; // 关联关系,Person类包含一个Address类的指针};
      
  • 在UML类图中单向关联用一个带箭头的实线表示。
    在这里插入图片描述

3.1.2 双向关联

  • 双向关联就是双方各自含有对方类型的成员变量
    •   // 课程类class Course {public:void setTeacher(Teacher* teacher) { m_teacher = teacher;}std::string getName()  { return m_name; }Teacher* getTeacher() { return m_teacher; }private:std::string m_name;Teacher* m_teacher; // 课程属于哪个教师};// 教师类class Teacher {public:// 获取教师姓名std::string getName() const { return m_name; }// 给教师设置课程void setCourse(Course* course) { m_courses = course;  };// 获取该教师教授的所有课程Course* getCourses() { return m_courses; }private:std::string m_name; // 教师姓名Course* m_courses; // 教师对应的课程};
      
  • 在UML类图中,双向关联用一个不带箭头的直线表示
    在这里插入图片描述

3.2 聚合关系

  • 这是一种特殊形式的关联,表示类之间整体与部分的关系,其中部分可以独立存在,即使整体不存在。
  • 下面实现了一个员工类和部门类,部门类中包含了员工类对象。而员工类可以离开部门类而单独存在。
    •   // 员工类class Employee {public:std::string getName() const { return m_name; }int getId() const { return m_id; }private:std::string m_name;int m_id;};// 部门类class Department {public:// 添加员工void addEmployee(Employee emp) {m_employees.push_back(emp);}// 展示员工信息void displayEmployees() {std::vector<Employee>::iterator iter = m_employees.begin();for (; iter != m_employees.end(); iter++) {std::cout << "name : " << iter->getName();std::cout << "id : " << iter->getId();}}private:std::vector<Employee> m_employees; // 部门类包含员工对象的容器,形成聚合关系};
      
  • UML类图中,组合关系用带空心菱形的实线表示,菱形指向整体。
    在这里插入图片描述
  • 聚合关系可以是一对一,也可以是一对多。比如Department中可以包含多个Employee数组,也可以只包含一个Employee对象。

3.3 组合关系

  • 组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。在组合关系中,整体对象可以控制部分对象的声明周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。
  • 实现一个引擎类和汽车类,引擎属于汽车的一部分,且引擎不能脱离汽车而单独存在。
    •   // 引擎类,是汽车类的一部分class Engine {public:int getHorsePower() { return m_horsePower; }private:int m_horsePower;};// 汽车类class Car {public:int getCarId() { return m_carId; }int getEngineHorsePower() { return m_engine->getHorsePower(); }private:int m_carId;Engine* m_engine; // Car类组合了一个Engine对象};
      
  • UML类图中,组合关系用带实心菱形的实线表示,菱形指向整体。
    在这里插入图片描述

3.4 依赖关系

  • 依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。
  • 依赖关系指的是一个类依赖于另一个类的功能或服务,但并不直接拥有或包含另一个类的实例。依赖关系通常体现在一个类的方法中通过参数传递、全局函数或静态方法等方式使用另一个类。
  • 比如有一个People类和Circle类,People类中并不包含Circle,但是可以调用Circle类对象的draw方法来画一个圆。
    •   // 圆class Circle {public:// 画圆void draw() { }private:int m_radius;};// 有一个人class People {public:// 调用圆类的画圆方法void drawCircle(Circle circle) { circle.draw(); }private:string m_name;};
      
  • 在UML类图中,依赖关系用带箭头的虚线表示,箭头从使用类指向被依赖的类。
    在这里插入图片描述

3.5 继承(泛化)关系

  • 继承(泛化)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系。
  • 比如学生类和教师类都继承于基本类People,有基本方法sleep和eat以及各自独有的方法study和work
    •   class People {public:void sleep() {  }void eat() { }private:int m_name;};class Studet : public People {public:void study() {}private:int m_studentId;};class Teacher : public People {public:void work() {}private:int m_jobNumber;};
      
  • UML类图中,继承关系用带空心三角箭头的实线表示,箭头从子类指向父类。
    在这里插入图片描述

3.6 实现关系

  • 实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
    •   // 抽象接口类,相当于UML中的Interfaceclass Printable {public:virtual void print()  = 0;};// 具体实现类,实现了Printable接口class Document : public Printable {public:// 实现接口中的print()函数void print() {std::cout << "Content of the document: " << m_content << std::endl;}private:std::string m_content;};
      
  • 在UML类图中,实现关系使用带空心三角箭头的虚线表示
    在这里插入图片描述

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

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

相关文章

高效率改写文章,一键智能改写工具有妙招

如今&#xff0c;写作已经成为人们日常生活中不可或缺的一部分。无论是职场人士撰写工作报告&#xff0c;还是专业的作者创作文章&#xff0c;都离不开对文字的润色和改写。然而&#xff0c;随着工作量与时间压力的增加&#xff0c;如何在保证质量的前提下提高文章改写的效率成…

关于GDAL计算图像坐标的几个问题

关于GDAL计算图像坐标的几个问题_gdal读取菱形四角点坐标-CSDN博客 这篇文章写的很好&#xff0c;讲清楚了图像行列号与图像点坐标&#xff08;x,y&#xff09;对应关系&#xff0c;以及图像行列号如何转为地理坐标的&#xff0c;转载一下做个备份。 1.关于GDAL计算图像坐标的…

数据库服务的运行与登录

打开数据库服务 数据库服务: SQL Server(MSSQLServer) 运行在服务器端的应用程序, 提供数据的存储 / 处理和事务等在使用DBMS的客户端之前必须首先打开该服务 客户端连接到服务器 关于客户端 / 服务器端的说明 客户端 : 数据库管理系统(DBMS), 应用程序服务器端 : 安装的数据…

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户&#xff0c;然后通过本地电脑telnet 软件ensp中的设备&#xff0c;尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

户外旅行摄影手册,旅游摄影完全攻略

一、资料前言 本套旅游摄影资料&#xff0c;大小295.47M&#xff0c;共有9个文件。 二、资料目录 《川藏线旅游摄影》杨桦.彩印版.pdf 《户外摄影指南》(Essential.Guide.to.Outdoor.photography.amateur)影印版.pdf 《旅行摄影大师班》(英)科尼什.扫描版.PDF 《旅行摄影…

迈向智能工厂:工业互联网时代的生产革命-亿发

随着各行各业数字化转型的加速推进&#xff0c;企业对于数据资产高效流动的需求日益增长&#xff0c;工业互联网网络也在数字经济发展中扮演着愈发重要的角色。什么是智能工厂简单来说就是基于万物互联的技术基础&#xff0c;实现企业内部数据的自由流动&#xff0c;从而促进数…

【高阶数据结构】哈希表 {哈希函数和哈希冲突;哈希冲突的解决方案:开放地址法,拉链法;红黑树结构 VS 哈希结构}

一、哈希表的概念 顺序结构以及平衡树 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系。因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)&#xff1b;平衡树中为树的高度&#xff0c;即O(log_2 N)&#xf…

【第1节】书生·浦语大模型全链路开源开放体系

目录 1 简介2 内容&#xff08;1&#xff09;书生浦语大模型发展历程&#xff08;2&#xff09;体系&#xff08;3&#xff09;亮点&#xff08;4&#xff09;全链路体系构建a.数据b 预训练c 微调d 评测e.模型部署f.agent 智能体 3 相关论文解读4 ref 1 简介 书生浦语 InternLM…

深入理解GCC/G++在CentOS上的应用

文章目录 深入理解GCC/G在CentOS上的应用编译C和C源文件C语言编译C语言编译 编译过程的详解预处理编译汇编链接 链接动态库和静态库静态库和动态库安装静态库 结论 深入理解GCC/G在CentOS上的应用 在前文的基础上&#xff0c;我们已经了解了CentOS的基本特性和如何在其上安装及…

Python零基础从小白打怪升级中~~~~~~~多线程

线程安全和锁 一、全局解释器锁 首先需要明确的一点是GIL并不是Python的特性&#xff0c;它是在实现Python解析器(CPython)时所引入的一个概念。 GIL全称global interpreter lock&#xff0c;全局解释器锁。 每个线程在执行的时候都需要先获取GIL&#xff0c;保证同一时刻只…

IDEA plugins 好用的插件集

IDEA plugins RestfulToolkit 1. 安装插件 File–>Settings --> plugins --> RestfulToolkit 2.插件有点&#xff1a; 2.1、帮助把项目中的 RestURL 按照项目汇总出来&#xff0c;找到对应URL直接在IDEA上面进行请求测试。 2.2、开发Java Web页面项目&#xff0c;经…

学习笔记------时序约束之时钟周期约束

本文摘自《VIVADO从此开始》高亚军 主时钟周期约束 主时钟&#xff0c;即从FPGA的全局时钟引脚进入的时钟或者由高速收发器输出的时钟。 对于时钟约束&#xff0c;有三个要素描述&#xff1a;时钟源&#xff0c;占空比和时钟周期。 单端时钟输入 这里我们新建一个工程&#x…

【Proteus】51单片机对直流电机的控制

直流电机&#xff1a;输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机&#xff0c;电能转换为机械能&#xff1b;作发电机运行时是直流发电机&#xff0c;机 械能转换为电能。 直流电机的控制&#xff1a; 1、方向控制…

手撕AVL树(map和set底层结构)(1)

troop主页 今日鸡汤&#xff1a;Action may out always bring happiness;but there is no happiness without action. 行动不一定能带来快乐&#xff0c;但不行动一定不行 C之路还很长 手撕AVL树 一 AVL树概念二 模拟实现AVL树2.1 AVL节点的定义 三 插入更新平衡因子&#xff0…

vim相关指令

vim的各种模式及其转换关系图 vim 默认处于命令模式&#xff01;&#xff01;&#xff01; 模式之间转换的指令 除【命令模式】之外&#xff0c;其它模式要切换到【命令模式】&#xff0c;只需要无脑 ESC 即可&#xff01;&#xff01;&#xff01; [ 命令模式 ] 切换至 [ 插…

联合体共用体--第二十三天

1.结构体元素有各自单独的空间 共用体元素共享空间&#xff0c;空间大小由最大类型确定 2.结构体元素互不影响&#xff0c;共用体赋值会导致覆盖

javaWeb智能医疗管理系统

简介 在当今快节奏的生活中&#xff0c;智能医疗系统的崛起为医疗行业带来了一场革命性的变革。基于JavaWeb技术开发的智能医疗管理系统&#xff0c;不仅为医疗机构提供了高效、精准的管理工具&#xff0c;也为患者提供了更便捷、更个性化的医疗服务。本文将介绍一个基于SSM&a…

一些重新开始面试之后的八股文汇总

一、内存中各项名词说明 1、机器内存概念说明 linux中的free命令可以查看机器的内存使用情况&#xff0c;vmstat命令也可以 其中不容易被理解的是&#xff1a; 内存缓冲/存数&#xff08;buffer/cached&#xff09; 1.buffers和cache也是RAM划分出来的一部分地址空间 2.buff…

SQL优化——统计信息

文章目录 1、统计信息1.1、表的统计信息1.2、列的统计信息1.3、索引的统计信息 2、统计信息重要参数设置3、检查统计信息是否过期4、扩展统计信息5、动态采样6、定制统计信息收集策略 只有大表才会产生性能问题&#xff0c;那么怎么才能让优化器知道某个表多大呢&#xff1f;这…

移动硬盘故障解析:NTFS属性0字节,双击无法访问的数据恢复之道

一、故障现象&#xff1a;移动硬盘NTFS属性0字节&#xff0c;双击无法访问 在日常使用移动硬盘的过程中&#xff0c;有时我们会遇到一个令人困惑的问题&#xff1a;移动硬盘在接入电脑后&#xff0c;显示其属性为NTFS格式&#xff0c;但容量却显示为0字节&#xff0c;且双击无…