C++基础——C++面向对象之数据封装、数据抽象与接口基础总结

news2024/11/15 23:54:57

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 

《项目案例分享》

《极客DIY开源分享》

《嵌入式通用开发实战》

《C++语言开发基础总结》

《从0到1学习嵌入式Linux开发》

《QT开发实战》

《Android开发实战》

《实用硬件方案设计》

《结构建模设计》

《数据库开发总结》

《JAVA入门基础》

《JavaWeb开发实战》

长期持续带来更多案例与技术文章分享;

欢迎商业项目咨询,10年+软硬全栈内功,助力解决您的尊贵需求。

原文链接:https://winter.blog.csdn.net/article/details/129418745

——————————————————————————————————

目录

0 引言

1 数据封装

2 数据抽象

3 接口(抽象类)

4 总结


0 引言

        这一次的博文总结下数据封装、数据抽象与接口,其实有之前博文的基础这里也很容易理解。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制, C++ 通过创建类来支持封装和数据隐藏(public、protected、 private)。

1 数据封装

        数据封装是一种把数据和操作数据的函数捆绑在一起的机制,在 C++程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例。 通常情况下,我们都会设置类成员状态为私有(private),除非我们真的需要将其暴露,这样才能保证良好的封装性。这通常应用于数据成员,但它同样适用于所有成员,包括虚函数。

下面举个例子,看下数据封装的使用方法,其实就是合理的使用public、private。

        以People类为例,增加一个吃苹果的方法eatApple(int number),以及获取苹果总数的方法getApple(),将该方法设定在public下,这样eatApple(int number)、getApple()方法就暴露了出来,即对外的接口。然后设置Peopel类的私有成员(private)苹果的数量total。

新建一个10_fengzhuang目录,其下新建一个10_fengzhuang.cpp文件,代码如下:

#include <iostream>
#include <string>
using namespace std;

class People
{
private:
	int total;
public:
	string name;
	People(int i = 0)
	{
		total = i;
	}
	
	void eatApple(int cnt){
		total = total + cnt;
	}

	int getApple(){
		return total;
	}
};

int main()
{
	People people;
	people.name = "小芳";
	people.eatApple(1);
	people.eatApple(2);
	cout << people.name << "吃的苹果总数:" << people.getApple() << endl;
}

程序中,在People类的构造函数中初始化了total为0,一般都是在构造函数中做初始化,而非在类内直接赋初值,可能会有编译器不支持的情况;程序中其他就没什么好说的了。

编译程序,运行查看结果:

2 数据抽象

        数据抽象,指的是只向外界提供关键信息,并隐藏实现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。这么做有什么好处呢?

  • 1)类的内部受到保护,不会因无意的用户级错误导致对象状态受损;
  • 2)类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。

        举个例子,比如手机可以拍照、听音乐、 收音, 这些都是手机上的功能,用户可以直接使用。 但是拍照的功能是如何实现的,是怎么通过摄像头取像然后怎么在屏幕上显示的过程,作为用户是不需要知道,也不必知道,只需要知道如何拍照即可。

         C++ 类为数据抽象提供了可能,它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现。如cout这个对象就是一个公共的接口,我们不必要知道 cout 是如何在屏幕上显示内容的,cout 已经在底层实现好了。

        数据封装是一种把数据和操作数据的函数捆绑在一起的机制, 而数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制,比如上面数据封装小节的实例其实也就是个数据抽象的实例,people.eatApple()或people.getApple()也是一个对外的接口。这里就不再单独写例程了,理解了数据抽象这个概念即可。

3 接口(抽象类)

C++中面向对象很多特征都跟Java的太类似了,这个接口也不例外。

        接口描述了类的行为和功能,而不需要完成类的特定实现。 C++ 接口是使用抽象类来实现的(抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念)。 如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的。

        设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支
持使用 ABC 声明接口。
如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。可用于实例化对象的类被称为具体类。

        下面举例说明抽象类的用法,这个跟多态有点类似了,只不过多态中使用virtual定义的是虚函数,且虚函数完成了类的特定实现,而抽象类要定义成纯虚函数,纯虚函数不用实现,由派生类重写即可。

        新建一个目录 11_abstract,编辑一个 11_abstract.cpp,代码如下:

#include <iostream>
#include <string>
using namespace std;
 
//动物类
class Animal
{
public:
	virtual void speak() = 0;
};
 
//定义一个People类,继承Animal
class People : public Animal
{
public:
	void speak(){
		cout << "People的speak()方法" << endl;
	}
};
 
//定义一个Dog类,继承Animal
class Dog : public Animal
{
public:
	void speak(){
		cout << "Dog的speak()方法" << endl;
	}
};
 
int main()
{

	People people;
	Dog dog;
	people.speak();
	dog.speak();
 
	return 0;
}

编译程序,运行结果如下:

        输出结果跟https://winter.blog.csdn.net/article/details/129418745结果一样,但要理解的是多态和这个接口是两个不同的思想,前者通过虚函数实现多态的机制,核心就是通过基类访问派生类定义的函数;后者是通过纯虚函数实现的接口机制,目的是为了给其他类提供一个可以继承的适当的基类。

4 总结

        本次博文总结数据封装、数据抽象,以及接口, 数据封装是一种把数据和操作数据的函数捆绑在一起的机制, 而数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制,在 C++程序中,任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例,接口(抽象类)描述了类的行为和功能,而不需要完成类的特定实现。这三个有点绕,写几个实例对比感觉下就知道了。

作于202303091600,已归档

———————————————————————————————————

本文为博主原创文章,未经博主允许不得转载!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

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

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

相关文章

打怪升级之字符串的分界符与字符串替换

流的字符串分界符 在C的iostream中&#xff0c;有流的字符串分界符&#xff1a; " “和”"都代表简单的分隔。 因此&#xff0c;使用流来做字符串分隔的话&#xff0c;有一个比较简单的方案就是将原定义的分隔符通过替换的方式变成流的分隔符。然后再录入流中就能…

【论文简述】Learning Optical Flow with Kernel Patch Attention(CVPR 2022)

一、论文简述 1. 第一作者&#xff1a;Ao Luo 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;光流、局部注意力、空间关联、上下文关联 5. 探索动机&#xff1a;现有方法主要将光流估计视为特征匹配任务&#xff0c;即学习在特征空间中将…

软件设计师教程(十)计算机系统知识-结构化开发

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;…

Zookeeper3.5.7版本——客户端命令行操作(节点删除与查看)

目录一、节点删除示例1.1、节点删除1.2、递归节点删除二、查看节点状态示例一、节点删除示例 1.1、节点删除 在客户端上创建 test 节点&#xff0c;并查看该节点 [zk: localhost:2181(CONNECTED) 5] create /test "123456"删除 test 节点&#xff0c;并查看该节点 […

初识rollup 打包、配置vue脚手架

rollup javascript 代码打包器&#xff0c;它使用了 es6 新标准代码模块格式。 特点&#xff1a; 面向未来&#xff0c;拥抱 es 新标准&#xff0c;支持标准化模块导入、导出等新语法。tree shaking 静态分析导入的代码。排除未实际引用的内容兼容现有的 commonJS 模块&#…

Sqoop详解

目录 一、sqoop基本原理 1.1、何为Sqoop&#xff1f; 1.2、为什么需要用Sqoop&#xff1f; 1.3、关系图 1.4、架构图 二、Sqoop可用命令 2.1、公用参数&#xff1a;数据库连接 2.2、公用参数&#xff1a;import 2.3、公用参数&#xff1a;export 2.4、公用参数&#xff…

MySQL数据库和表管理

MySQL数据库和表管理一、常用的数据类型1、int(N)2、float(m,d)3、char与varchar二、查看数据库结构1、查看当前服务中的数据库2、查看数据库中存在的表3、查看表结构三、SQL语句1、SQL语言规范2、SQL语言分类四、创建、删除数据库和表1、创建数据库2、创建表3、删除数据表4、删…

云医疗信息系统源码(云HIS)商业级全套源代码

云his系统源码&#xff0c;有演示 一个好的HIS系统&#xff0c;要具有开放性&#xff0c;便于扩展升级&#xff0c;增加新的功能模块&#xff0c;支撑好医院的业务的拓展&#xff0c;而且可以反过来给医院赋能&#xff0c;最终向更多的患者提供更好地服务。 私信了解更多&…

HTTPS加密流程

什么是HTTPSHTTPS是加密后的HTTP,相当于:HTTPS HTTP SSL/TLSHTTPS是基于"密钥"来实现的,客户端将发送的数据用密钥进行加密,服务器将收到的数据用密钥解密.对称加密和非对称加密对称加密是指:交互双方共同使用同一个密钥进行加密 或 解密.如下(图中的客户端和服务器…

还不会CAD批量打印图纸?学会这招再也不怕

各位工程师&#xff0c;相信大家在工作过程中&#xff0c;经常会遇到需要打印大量图纸文件的时候&#xff0c;那么多的图纸&#xff0c;一张张打印太麻烦&#xff0c;此时便需要用到CAD批量打印功能啦&#xff01;可是&#xff0c;总有些新手设计师不直达奥CAD批量打印&#xf…

Spring事务及传播机制

概念 在MySQL中介绍过&#xff0c;当同一时间出现一起读写数据的情况&#xff0c;可能会导致最终的结果出错&#xff0c;因此可以使用事务来提高隔离级别 而Spring中也可以实现事务 手动添加事务 使用SpringBoot中的DataSourceTransactionManager对象可以获取事务&#xff0…

计算机科学导论笔记(六)

目录 八、算法 8.1 概念 8.1.1 非正式定义 8.1.2 示例 8.1.3 定义动作 8.1.4 细化 8.1.5 泛化 8.2 三种结构 8.2.1 顺序 8.2.2 判断 8.2.3 循环 8.3 算法的表示 8.3.1 UML 8.3.2 伪代码 8.4 更正式的定义 8.5 基本算法 8.5.1 求和 8.5.2 求积 8.5.3 最大和最…

Egg:使用joi进行参数校验以及注册接口小demo

目录 前言&#xff1a; 准备工作&#xff1a; 前端代码&#xff1a; 后端目录截图&#xff1a; 1.获取参数 2.校验参数 3.查询数据库中是否已经存在该用户 4.用户入库 5.测试一哈 添加用户成功 同样的用户名再注册一遍 ​编辑总结&#xff1a; 前言&#xff1a; 在阅…

C#基础之基础语法(一)

总目录 文章目录总目录前言一、C#简述1 C#是什么&#xff1f;2 .Net平台3. C# 和.Net的关系4. 集成开发环境&#xff08;IDE&#xff09;二、控制台应用程序1. 常用代码2.注意事项三、基础语法1.编写C#代码注意事项2.C#注释2. 变量&标识符&关键字4. 变量&#xff0c;字…

unity 面试汇总

1、什么是协同程序&#xff1f;答&#xff1a;在主线程运行时同时开启另一段逻辑处理&#xff0c;来协助当前程序的执行。换句话说&#xff0c;开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别&#xff…

【C++进阶】四、AVL树(二)

目录 前言 一、AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 四、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 左右双旋 4.4 右左双旋 五、AVL树的验证 六、AVL树的性能 七、完整代码 前言 前面对 map/multimap/set/multiset 进行了简单的介绍&#xff0c;在其文…

2023年湖北武汉安全员C证报考条件是什么?考试题型是什么 启程别

2023年湖北武汉安全员C证报考条件是什么&#xff1f;考试题型是什么 启程别 武汉安全员C证报考条件&#xff1a; 1.注册地在本市的施工单位在职“三类人员”可申请参加安全生产考核&#xff1b; 2、职业道德良好&#xff0c;身体健康&#xff0c;年龄不超过60周岁&#xff08…

pdf多页合并为一页方法总结,你觉得哪个最好?

PDF格式的文件在现代办公中是不可或缺的&#xff0c;许多人在工作中需要频繁处理PDF文档。然而&#xff0c;当我们需要阅读多个PDF文件时&#xff0c;不断切换不同的文件并一个一个地打开查阅会非常麻烦。为了提高阅读效率&#xff0c;人们一般会将pdf多页合并为一页。那么&…

传输线的物理基础(四):传输线的驱动和返回路径

驱动一条传输线对于将信号发射到传输线的高速驱动器&#xff0c;传输线在传输时间内的输入阻抗将表现得像一个电阻&#xff0c;相当于线路的特性阻抗。鉴于此等效电路模型&#xff0c;我们可以构建驱动器和传输线的电路&#xff0c;并计算发射到传输线中的电压。等效电路如下图…

虹科分享 | 网络流量监控 | 数据包丢失101

什么是数据包&#xff1f; 数据包是二进制数据的基本单位&#xff0c;在网络连接的设备之间编号和传输&#xff0c;无论是在本地还是通过互联网。一旦数据包到达其目的地&#xff0c;它就会与其他数据包一起按编号重新组合&#xff0c;回到最初传输的较大消息中。 数据包是我们…