首页 > 编程语言 >C++20高级编程 第五章 面向对象程序设计

C++20高级编程 第五章 面向对象程序设计

时间:2023-11-29 13:34:46浏览次数:36  
标签:关系 20 对象 C++ 面向对象 组件 UML 属性

第五章 面向对象设计


面向过程思想

众所周知的,C语言是一门 面向过程编程 的语言,而C++是一门 半面向对象编程(Object Oriented Programming,OOP) 的语言.

面向过程编程的语言通常将代码分割成小块,每个小块理论上完成单一的任务.如果在C程序中没有过程,所有代码都会集中于main()中.

事实上,计算机并不关心代码是位于main()中还是被分割成具有描述性名称和注释的小块.
 
经管C语言将过程表示为"函数",但是 C并非为一门真正的函数式语言 ."函数式(functional)"与"过程式(procedural)"有着很大的不同.函数式语言指类似于Lisp的语言.

面向对象思想

与基于"程序做什么"问题的面向过程方法不同,面向对象方法提出另一个问题: 对哪些对象进行建模?

OOP的基本观念是不应该将程序分割为若干任务,而是将其分为 自然对象的模型.

类(class) 将对象与其定义区分开来, 对象(object) 是类的一个 实例(instance).它拥有一些特征,从而与同一类型的其他事物区分开来.

组件

考虑一个复杂实际对象,会发现其由许多 组件(component) 所组成.对于OOP来说,将对象分解为更小的组件是一种必备能力,就像将复杂任务分解为较小过程是过程式编程的基础一样.

本质上,组件与类类似,但是组件更小、更具体

属性

属性(attribute) 将一个对象与其他对象区分开来.所有的对象都具有相同的属性,但是属性的值不同.属性用来描述对象的特征.

行为

行为 回答两个问题: "对象做什么""能对对象做什么".
在面向对象编程中,许多功能性的代码从过程转移到类.通过建立具有某些行为的对象并定义对象的交互方式,OOP以更丰富的机制将代码和代码操作的数据联系起来. 类的行为由类方法实现.

类之间的关系

"有一个"关系

在此类关系中,可认为某个类是另一个类的一部分.组件通常代表"有一个关系",因为组件表示组成其他类的类.
"有一个"关系有如下两种类型:

  • 聚合:当聚合器被销毁时,聚合对象(组件)可以继续存在.例如:假设动物园包含一组动物对象,当动物园破产时动物对象不会被销毁,他们被转移到另一个动物园. 失M(money)棍哥

  • 组合:对于组合,如果由其他对象组成的对象被销毁,那么这些其他对象也会被销毁.

"是一个"关系

"是一个"关系是面向对象编程中非常基本的概念,因此有许多名称,包括 派生(deriving),子类(subclass),扩展(extending)和继承(inheriting).

类模拟了现实世界包含具有属性和行为的对象这一事实,继承模拟了这些对象通常以层次方式来组织这一事实.

  • 继承技术  
    当生成子类时,程序员有多种方法将某个类与其父类区分开.可使用多种方法生成子类.
        - 添加功能:增加新的方法
        - 替换功能:采用虚方法机制
        - 添加属性:增加新的属性
        - 替换属性:属性的重定义
  • 多态性

多态性(polymorphism) 指遵循一套标准属性和方法的对象可互换使用.类定义就像对象与之交互代码之间的契约.

"not-a"关系

当考虑类之间的关系时,应该考虑类之间 是否真的存在关系 .不要把面向对象设计的热情全部转换为许多不必要的类/子类关系

混入类

混入(mixin)类代表了类之间的另一种关系.在C++中,混入类的语法类似于多重继承,但语义完全不同.
使用混入类,可向类中添加功能,而不需要保证是完全的"是一个"关系.可将它当做一种分享(share-with)关系.

UML

统一建模语言(Unified Modeling Language,UML) 是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言.UML是面向对象设计的建模工具,独立于任何具体程序设计语言.

  • UML的图形:  
        - 用例图:从用户角度描述系统功能  
        - 类图:描述系统中类的静态结构  
        - 对象图:系统中的多个对象在某一时刻的状态。
        - 状态图:是描述状态到状态控制流,常用于动态特性建模
        - 活动图:描述了业务实现用例的工作流程
        - 顺序图:对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互
        - 协作图:描述对象之间的协助关系
        - 构件图:一种特殊的UML图来描述系统的静态实现视图
        - 部署图:定义系统中软硬件的物理体系结构
        - 包图:对构成系统的模型元素进行分组整理的图
        - 组合结构图:表示类或者构建内部结构的图
        - 交互概览图:用活动图来表示多个交互之间的控制关系的图

类图

类的基本表示法,包括了 名称,属性,方法:

  • 属性定义的格式:[可视性]属性名[:属性类型],其中[]内为可选内容
  • 方法定义的格式:[可视性]操作名[(参数列表)][:返回类型][{特性}]
  • 方法表示的意义:
        - -表示private
        - #表示protected
        - ~表示default,也就是包权限
        - _下划线表示static
        - 斜体表示abstract

alt 类图

类关系

在UML类图中,常见的有以下几种关系: 关联(Association),继承(Inheritance),依赖(Dependency),聚合(Aggregation),组合(Composition),实现(Realization).  
并且这些关系中有时之间是有关联的,存在关系之间的强弱.

alt 类关系

  • 关联:是一种拥有的关系,它使一个类知道另一个类的属性和方法,在C++中通过friend声明友元实现.
  • 继承:即继承关系,在C++中通过其内置的继承关系语法来实现.
  • 依赖:两个相对独立的对象,一个对象负责构造另一个对象的实例.
  • 聚合:是整体与部分的关系,且部分可以离开整体而单独存在.
  • 组合:是一种强的拥有关系,体现了严格的部分和整体关系.
  • 实现:表示一个class类实现interface接口的功能.

alt 类图示例

标签:关系,20,对象,C++,面向对象,组件,UML,属性
From: https://www.cnblogs.com/mesonoxian/p/17864628.html

相关文章

  • c++的多态
    在C++中,多态是面向对象编程的一个重要特性,它允许通过基类的指针或引用来调用派生类的成员函数。多态的字面意思是“多种形态”,它允许相同的操作可以作用于不同的对象,而具体执行的操作则取决于对象的类型和特性。在C++中,多态主要通过虚函数来实现。虚函数是在基类中使用关键字v......
  • 基本数据类型-C语言-2023/11/29
    ......
  • 2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现
    2023-11-29:用go语言,给你一个字符串s,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小。要求不能打乱其他字符的相对位置)。输入:s="cbacdcbc"。输出:"acdb"。来自左程云。答案2023-11-29:所有的代码用灵捷3.5编写,感觉有点抽风了,生成的代码需要修改......
  • 实型(浮点型) 字符型 枚举型 - C语言-2023/11/29
    实型(浮点型)字符型枚举型......
  • [数据管理] 政务/公共大数据 # 中国地方公共数据开放利用报告(省域)-2023
    0序言2023年11月1日,复旦大学数字与移动治理实验室联合国家信息中心-数字中国研究院在“全球智慧城市大会·长沙”发布了“2023中国开放数林指数”和《中国地方公共数据开放利用报告——省域》。作为也曾经在政务大数据领域一线数据项目耕耘了整整2年的数据人,对这个领域仍......
  • 即时通讯技术文集(第25期):实时音视频基础入门 [共20篇]
    ​为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第25 期。[- 1 -] 即时通讯音视频开发(一):视频编解码之理论概述[链接] http://www.52im.net/thread-228-1-1.html[摘要] 本文主要讲解实时音视频技术中视频技术的编解码基础理......
  • SpringMVC_2023_11_28_3 SpringMVC_进阶(文件的上传--idea的配置)
    SpringMVC_进阶(文件的上传--idea的配置)项目结构......
  • P7470 [NOI Online 2021 提高组] 岛屿探险
    我永远喜欢数据结构。题目传送门给出\(n\)个二元组\((a_i,b_i)\),有\(q\)次询问,每次给出\(l_i,r_i,c_i,d_i\),求有多少个\(j\)满足\(j\in[l_i,r_i]\)且\(a_j\oplusc_i\le\min\{b_j,d_i\}\)。\(n,q\le10^5\),设值域为\(V\),\(|V|\le2^{24}\)。\(2.00\,\text......
  • C++ 图论之次最小生成树
    1.前言生成树指在无向图中找一棵包含图中的所有节点的树,此树是含有图中所有顶点的无环连通子图。对所有生成树边上的权重求和,权重和最小的树为最小生成树,次小的为次最小生成树。最小生成树和次最小生成树的应用领域都较广泛。也是图论中优为重要的研究对象,求解算法也是常规必须......
  • Oracle Assets Adjustments API Documentation Supplement (Doc ID 206474.1)
    Appliesto:OracleAssets-Version11.5.10.2andlaterInformationinthisdocumentappliestoanyplatform.PurposeOracleAssetsAdjustmentsAPIYoucanusetheAdjustmentsAPItoadjustassetsdirectlyviaPL/SQLratherthanusingtheOracleAssetsinterf......