当前位置: 首页 > news >正文

C++ 抽象与封装

一 抽象

抽象实例:时钟
数据抽象:
具有表面当前时间的时、分、秒

行为抽象:
具有设置时间和显示时间两个最基本的功能。

抽象实例:人
数据抽象:姓名、年龄、性别等。

行为抽象:
生物属性:吃饭、穿衣、睡觉、行走等行为。
社会属性:工作、学习等行为。

抽象
抽象是对具体对象(问题)进行概括,提炼出这一类对象的公共性质并加以描述的过程。

先注意问题的本质机描述,其次是实现过程或细节。
数据抽象:描述某类对象(食物)共有的属性或状态。
行为抽象:描述某些对象(食物)共有的行为特征或具有的功能。

抽象是相对,而非是绝对的。

在研究问题时,侧重点不同,可能会产生不同的抽象结果;解决同一问题时要求不同,也会产生不同的抽象结果。

如果开发一个人事管理软件,那么关心的时员工的姓名、性别、工龄、工资、工作部门等相关信息。

如果开发学籍管理软件,那么关心的时学生的姓名、性别、年龄、籍贯、所在学院等相关信息。

在这里插入图片描述

二定义与声明

1 定义和使用类的基本过程

第一步:进行抽象;
第二步:声明类;
第三步:实现类;
第四步:使用类;

2 类的声明:类的成员构成

类是一种抽象数据类型,声明形式如下:
在这里插入图片描述

3 声明类举例:时钟类

在这里插入图片描述

三 访问控制

类成员的访问控制
什么是“类内”和“类外”;
在类声明之内称为类内;
在类声明之外称为类外;

什么事“类内”和“类外”;
在类声明之内称为类内;
在类声明之外称为类外;

数据封装的目的就是信息隐蔽。为了达到信息隐蔽,在C++类中,并非所有的成员都是对外可见的(或者说,是类外可以访问的)

通过设置成员的访问控制属性来实现对类成员的访问控制。
这些控制属性有:public、protected、private.

1 类的声明:对成员的访问控制

在这里插入图片描述

2 公有成员

在关键字public后面声明,它们是类与外部的接口,任何类内、类外函数都可以访问公有数据和函数。
在这里插入图片描述

3 私有成员

在关键字private后面声明,只运行本类中的函数访问,而类外的任何函数都不能访问。
在这里插入图片描述

3 保护成员

在关键字protected后面声明的数据成员或成员函数。与pirvate类似,其差别表现在继续与派生时对派生类的影响不同。

4 类声明举例:时钟类

在这里插入图片描述

四 类的实现与使用

1 类实现

实现一个类,就是按照所设定的功能语义去实现类中的每一个成员函数。

在这里插入图片描述

2 类的使用

类是一种数据类型,类的变量称作类的实例,或对象。
定义对象的方式:类名 对象名;
例如:Clock aclock;

3 访问类成员的方法

通过对象来访问成员
对象名.公有成员函数(形参列表);
对象名.公有数据成员

通过对象指针来访问成员
对象的指针->公有成员函数名(形参列表);
对象的指针->公有数据成员

举例:一个比较完整的Clock类 声明Clock类
在这里插入图片描述
实现Clock类中的成员函数
在这里插入图片描述
使用Clock类
在这里插入图片描述
2个指针指向同一个对象,如果其中一个指针改变了对象值,另外一个指针访问的值会不会改变?为什么?
在这里插入图片描述
总结:定义和使用类类型的过程
抽象:对事物进行抽象;
声明类:根据抽象的结果定义类的特性;
实现类:实现类中成员函数的逻辑;
使用类:在程序中定义类的实力,使用类的公有成员。

4 类对外的接口

在定义类时,把可以被外部访问的成员说明public属性,作为外部访问类中成员的接口。把不能被外部访问的成员说明为private或protected属性。
在这里插入图片描述
在声明类时,具有不同访问属性的成员可以按任意顺序出现。
在这里插入图片描述
修饰访问属性关键字可以多次出现。
在这里插入图片描述
一个成员只能具有一种访问属性,否则会出现歧义。
在这里插入图片描述

五 类的对象

例子:简单int数组类
第一步:抽象
数据抽象
数组大小;
数组所占据的内存区;
行为抽象
能够获得数组的大小;
能够将数据保存到数组中;
能够获得数组中所保存的最大值;
能够获得数组中所保存的最小值;

第二步:定义类
在这里插入图片描述
第三步:实现类
在这里插入图片描述
第三步:实现类(续)
在这里插入图片描述
第四步:使用类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在IntArray类中,函数成员getmaxVal和getMinVal在逻辑上是否存在共性?
在这里插入图片描述
两个函数的代码框架相似,只有在进行if条件判断时存在细微的差异。

改进:为IntArray类增加公用的私有函数
在这里插入图片描述
在这里插入图片描述

六 数据封装的相对性

以改进了的IntArray类为例,私有的成员函数getVal在类外(如main函数)是不能被调用的。

数据封装是一个相对的概念,只是对于类外而言。而对于类内部,所有的成员都是相互可见的。
在这里插入图片描述

相关文章:

C++ 抽象与封装

一 抽象 抽象实例:时钟 数据抽象: 具有表面当前时间的时、分、秒 行为抽象: 具有设置时间和显示时间两个最基本的功能。 抽象实例:人 数据抽象:姓名、年龄、性别等。 行为抽象: 生物属性:吃…...

antV X6的简要使用教程

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在我们的日常开发工作中,我们经常需要构建复杂的交互式图…...

【LLM 论文】Step-Back Prompting:先解决更高层次的问题来提高 LLM 推理能力

论文:Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models ⭐⭐⭐⭐ Google DeepMind, ICLR 2024, arXiv:2310.06117 论文速读 该论文受到的启发是:人类再解决一个包含很多细节的具体问题时,先站在更高的层次上解…...

Java——接口的补充

目录 一:接口的注意事项 1. 接口中不能有方法块; 2. 接口没有构造方法: 3.接口是可以多继承的; 4. 多个接口抽象方法重复 5. 类的父类方法与接口方法重复 二:类与接口 1. 继承与实现 2. 多个父接口的抽象…...

word转pdf的java实现(documents4j)

一、多余的话 java实现word转pdf可用的jar包不多,很多都是收费的。最近发现com.documents4j挺好用的,它支持在本机转换,也支持远程服务转换。但它依赖于微软的office。电脑需要安装office才能转换。鉴于没在linux中使用office,本…...

基于K8S构建Jenkins持续集成平台

文章目录 安装和配置NFSNFS简介NFS安装 在Kubernetes安装Jenkins-Master创建NFS client provisioner安装Jenkins-Master Jenkins与Kubernetes整合实现Jenkins与Kubernetes整合构建Jenkins-Slave自定义镜像 JenkinsKubernetesDocker完成微服务持续集成拉取代码,构建镜…...

PHPStudy 访问网页 403 Forbidden禁止访问

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 注意:一定要安装解压软件 很多同学解压靶场代码以后访问报错的原因是:电脑上没有解压软件。 这个时候压缩包看起来就是黄色公文包的样子,右键只有“全部提取…...

热爱电子值得做的电子制作实验

加我zkhengyang,进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作,磁带随声听散件,黑白电视机散件制作,功放散件制作,闪光灯散件制作,声控灯散件,等等,可提高动手能…...

.class文件启动过程以及文件内容结构讲解

当你直接启动一个.class文件时,实际上是在操作系统中调用Java虚拟机(JVM),并将该.class文件传递给JVM以执行。现在让我们来解释一下.class文件的启动过程以及文件内容结构: 启动过程:操作系统通过指定的命…...

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念,而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中,高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者,西门子Insight楼宇自动化…...

2024.05.10作业

TCP服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; …...

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作读者优先实例代码分析写者优先读写公平法示例代码分析实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别…...

重生我是嵌入式大能之串口调试UART

什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备进…...

【智能优化算法】蜜獾优化算法(Honey Badger Algorithm,HBA)

蜜獾优化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”&#xff08;IF 3.6&#xff09;的2022年智能优化算法 01.引言 蜜獾优化算法(Honey Badger Algorithm,HBA)受蜜獾智能觅食行为的启发&#xff0c;从数学上发展出一种求解优化问题的…...

【算法与数据结构】数组

文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…...

【数据结构】队列详解(Queue)

文章目录 有关队列的概念队列的结点设计及初始化队列的销毁判空和计数入队操作出队操作 有关队列的概念 队列:只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端…...

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和相机Statistics图像传输统计信息的技术背景Baumer工业相机通过NEOAPISDK获取相机的Statistics图像传输统计信息技术1.引…...

FreeRTOS标准库例程代码

1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…...

wandb: - 0.000 MB of 0.011 MB uploaded持续出现的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

分布式模式让业务更高效、更安全、更稳定

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;分布式模…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...