C++之类的关系及其UML图

基本概念

在UML类图中,类一般由三部分组成:
(1)类名 :每个类都必须有一个名字,类名是一个字符串。
(2) 属性 :属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。UML规定属性的表示方式为:
可见性 名称:类型 [ = 缺省值 ]
其中:
1、可见性:表示该属性对于类外的元素是否可见,包括公有(public)、私有(private)和受保护(protected)三种。
表示可见性的符号

  • ‘+’: public
  • ‘-’ :private
  • ‘#’: protected

2、名称:表示属性名称,用一个字符串表示。
3、类型:表示属性的数据类型。可以是基本数据类型,也可以是用户自定义类型。
4、缺省值:是可选的,表示属性的初始值。
(3)方法 :是类的成员方法。UML规定操作的表示方式为:
可见性 名称(参数列表) [ : 返回类型]
其中:
1、可见性:与属性的可见性定义相同。
2、名称:方法名,用一个字符串表示。
3、参数列表:方法的参数。参数个数是任意的,多个参数之间用逗号隔开。
4、返回类型:是可选的,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。
举例:

class BMI
{
public:
  BMI(const string& newName, int newAge, 
    double newWeight, double newHeight);
    
  BMI(const string& newName, double newWeight, double newHeight);
  double getBMI() const;

  string getStatus() const;
  string getName() const;
  int getAge() const;
  double getWeight() const;
  double getHeight() const;

private:
  string name;
  int age;
  double weight;
  double height;
};

在这里插入图片描述

类之间的关系

依赖(Dependency)

一个类A使用到了另一个类B,类B的变化会影响到A,但类B不属于类A;比如我写作业,要用到笔,我和笔之间的关系就是依赖。
类A与类B彼此独立,而类B是类A中
1、成员函数的一个参数
2、成员函数的一个局部变量
3、A对B静态方法的调用

#include <iostream>

using namespace std;
class Pen
{
private:
    char color;
public:
    void write(){cout<<"writing";}
    static void finish()
    {//静态方法
        cout<<"You have finished your homework!";
    }
};
class Myself
{
private:
    char name;
    int age;
public:
    void HomeWork(Pen p);//成员函数的一个参数
    void use()
    {
        Pen p;//Pen是Myself中成员函数的一个局部变量
        cout<<"I am ";
        p.write();
        cout<<endl;
    }
    void award()
    {
        Pen::finish();//Myself对Pen中静态方法的调用
        cout<<"Go to relax now!";
    }
};
int main()
{
    Myself a;
    a.use();
    a.award();
    return 0;
}

在这里插入图片描述

继承(泛化(Generalization))

is-a 的关系。子类继承父类,则子类可以拥有父类的某一些状态和行为,也能进行功能的扩展。比如数学是一门学科,数学拥有学科的属性,也有自己的属性。

class Subject
{

};
class Math :public Subject
{

};

在这里插入图片描述

实现(Realization)

实现对应的是面向对象中的"接口",即动物都要移动,但是每种移动的方式不一样,鸟要实现自己独有的移动的方法。
在C++中,接口通过的纯虚函数来实现,C++的多态就是通过虚函数来实现的。

class Animal{
    public:
        vitual void move();
};
class Bird: public Animal{
    void move(){
        //鸟的移动方式,飞
    }
};

在这里插入图片描述

关联(Assocation)

两个类、或者类与接口之间一种拥有的关系;一般的关联是平等的、平级的、没有整体和部分关系的,比如说我和我的同学。
关联可以是单向、双向的,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向,关联关系以实例变量的形式存在,在每一个关联的端点,还可以有一个基数(multiplicity),表明这一端点的类可以有几个实例;
被关联类B和关联类A
1、B以类属性的形式出现在A中
2、A引用了一个类型为B的全局变量在这里插入图片描述

聚合(Aggregation)

聚合关系是一种特殊的关联关系,是强关联关系,是整体和部分之间的关系,即has-a 的关系。整体与部分之间是可分离的,部分可以属于多个整体对象,也可以为多个整体对象共享,当整体的生命周期消亡后,部分仍然存在;比如,我在文具店打工,文具店拥有我这个员工,我还可以在书店打工,还可以在饭馆打工。但如果文具店倒闭了,我仍然存在。
A has a B:
1、B是A的成员变量

class Person
{
    
};
class Bookstore
{
private:
    Person p;
};

在这里插入图片描述

组合(Composition)

组合是一种特殊的聚合,他同样体现整体与部分间的关系,但是一种contains-a的关系,这种关系比聚合更强;而且整体与部分是不可分的,当整体的生命周期消亡后,部分也就不复存在了;比如学校里面有班级,如果学校没有了,那学校里的班级就自然没有了。
A contains B
1、成员变量

class Classroom
{
    
};
class School
{
public:
    Classroom c[10];
};

在这里插入图片描述
参考: https://www.cnblogs.com/xiaojiang1025/p/6677978.html
https://blog.csdn.net/weixin_42927264/article/details/82963556
https://www.cnblogs.com/mabaoqing/p/10316120.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值