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

【C++】 类基础汇总(类封装,构造、析构函数...)

目录

前言

正文

类封装

为什么要进行类封装

概念

访问修饰符

构造函数

概念

特点

析构函数

概念 

特点

再谈面向过程与面向对象

面向过程 

代码举例

面向对象 

 代码举例

结语

下期预告


前言

在学习过【C语言进阶C++】 C++基础--让你丝滑的从C语言进阶到C++ 之后,相信小伙伴们已经对C++面向对象的思维和C++中的一些语法有一定的了解了,那么我们继续往下学习,本次要学习的内容非常重要,那就是---类,它会在接下来的学习道路上扮演十分关键的角色。大家好好看!好好学!


正文

类封装

为什么要进行类封装

C语言中一般是由数据和算法组成,数据和算法彼此独立,关联性不强,在C++中将相互关联数据和算法封装起来,形成结构体或类,无论类还是结构体都是一个抽象的概念,只有定义类的变量时,数据才会真实存在,这个变量我们称之为对象,C++程序过程中,尽量避免单独的数据和算法,而是由一个类对象组成的,这就是面向对象。

概念

类(class):完成某一功能的数据和算法的集合,是一个抽象的概念。

对象:类的一个实例,具体的概念,是真正存在于内存中的。

 定义类的关键字class,类名一般以大写的C开头,成员属性一般以m_开头。

class CTest {int m_a;  //成员属性(成员变量)void show();  //成员方法(成员函数)
};

访问修饰符

类成员访问修饰符:描述了类成员的访问控制,即所能使用的一个范围,共有的public、保护的protected、私有的private(默认)。

public        :对外公开,在类内、类外都可以使用。

protected   :在类内和子类中可以使用。

private       :只能在类内使用。

对于类内的私有成员,我们可以提供访问接口(get***,set***)来按照一定的规则进行访问。

构造函数

概念

通常在定义变量时要初始化,在定义类对象时,成员属性并没有得到初始化。C++类提供了一种特殊的函数——构造函数。

构造函数:其作用是用来初始化类成员属性。空类中存在一个默认的无参数的构造,函数名为当前类名,无返回值。

class CTest {CTest (){}  //默认无参构造
};

特点

构造函数并不需要我们手动调用,在定义对象的时候会自动调用,这个默认的无参构造是编译器给提供的,函数体代码为空,所以在定义对象时虽然调用了,但并没有真正给成员初始化。所以多数情况下需要我们手动重构构造函数。

一个类中的构造函数允许存在多个,他们是函数重载的关系,重构的构造函数可以指定参数来符合我们需要的初始化过程。

注意

  • 只要重构了任何的构造函数,编译器将不会再提供那个默认的无参构造了。
  • 定义多个对象可能会执行不同的构造,这就要看在定义对象时如何指定参数了,会根据参数的类型、数量自动匹配对应的构造,但一个对象最终只能执行其中一个构造。

析构函数

概念 

析构函数:与构造函数相对应的析构函数,其作用是用来回收类中成员申请的额外空间,而不是对象本身。空类中存在一个默认的析构函数,函数名为~类名,无返回值,无参数。

class CTest {
~CTest(){ } //默认构造
};

特点

构造函数在对象的生命周期结束的时候,自动调用,编译器提供的默认的析构函数体代码也为空,我们可以手动重构,一旦重构,编译器就不会再提供那个默认析构了,与构造不同的是析构函数只允许存在一个。

注意

  • 析构在真正回收对象内存空间之前去调用,额外的空间回收完后,才真正回收对象内存空间。

再谈面向过程与面向对象

面向过程 

面向过程编程(Procedure-Oriented Programming,简称POP)是一种编程模型,也是初始踏入编程时接受的思想,过程即有一系列要执行的计算步骤,以过程为中心依次把要解决问题的步骤、流程分析出来,用函数封装好形成一个一个的模块,在主流程中按照具体的步骤调用相应的函数。

面向过程编程的主体是函数(模块),它以函数为中心,始终关注的是怎么一步一步解决问题,从而实现函数的顺序执行。

总结:自上向下,顺序执行、逐步细化。

代码举例

把大象放进冰箱:

void OpenRefrigerator(){cout<< "用手抓住冰箱门把手" <<endl;cout<< "缓慢打开门" <<endl;cout<< "拉到一定大的角度" <<endl;
}void PushElephant(int * p_refrig,int& h_refrig,int& h_ele){cout<< "找到冰箱的最大格子" <<endl;if(h_refrig < h_ele){cout<< "压缩一下大象" <<endl;h_ele = 5;}p_refrig = &h_ele;cout<< "大象放到冰箱里" <<endl;
}void CloseRefrigerator() {cout<< "开始推动冰箱门" <<endl;cout<< "继续推动冰箱门" <<endl;cout<< "冰箱门严丝合缝" <<endl;
}int main() {int heightEle = 10;   //大象的高度int heightRefrig = 10;  //冰箱的高度int * pEle = nullptr;   //冰箱里装的东西//---------开始打开冰箱-------------------OpenRefrigerator();//----------结束打开冰箱--------------------//----------开始装大象--------------------PushElephant(pEle,heightRefrig,heightEle);//----------结束装大象------------------------//----------开始关闭冰箱----------------------CloseRefrigerator();//-----------结束关闭冰箱---------------------return 0;
}

面向对象 

面向对象编程(Object-oriented programming,简称:OOP):面向对象编程是一种编程模型,以对象(数据)为中心,它把要解决的问题分解成各个对象(变量、数据)而不是各个流程、步骤,更专注于对象与对象之间的交互(而不是数据和方法、方法与方法),建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在解决整个问题步骤中的属性和行为。涉及到的属性和方法都被封装到一起包含在其内部。

世界上的每个事物都可以是一个独立的对象,其都有自己的属性和行为,对象与对象之间通过方法来交互。

面向对象编程的分析问题步骤:分析问题中参与其中的哪些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的属性和方法去解决问题。现实世界中,任何一个操作或者是业务逻辑的实现都需要一个实体来完成,实体就是动作的支配者,没有实体,就没有动作发生。

 代码举例

//定义大象的类
class CElephant {
public: int heightEle;
public:CElephant(int h) :height(h) {}
};//定义冰箱类
class Refrigerator {
public:int heightRefrig;CElephant* pEle;
public:Refrigerator(int h) :heightRefrig(h),pEle(nullptr){}void OpenRefrigerator() {cout<< "用手抓住冰箱门把手" <<endl;cout<< "缓慢打开门" <<endl;cout<< "拉到一定大的角度" <<endl;}void PushElephant(CElephant& ele){cout<< "找到冰箱的最大格子" <<endl;if(heightRefrig < ele.heightEle) {cout<< "压缩一下大象" <<endl;ele.heightEle = 5;}pEle = &ele;cout<< "大象放到冰箱里" <<endl;}void CloseRefrigerator() {cout << "开始推动冰箱门" << endl;cout << "继续推动冰箱门" << endl;cout << "冰箱门严丝合缝" << endl;}
};int main() {Refrigerator refrig(10);CElephant ele(10);//---------开始打开冰箱-------------------------refrig.OpenRefrigerator();//----------结束打开冰箱------------------------//----------开始装大象------------------------refrig.OpenRefrigerator();//----------结束装大象------------------------//----------开始关闭冰箱------------------------refrig.CloseRefrigerator();//----------结束关闭冰箱------------------------return 0;
}

结语

下期预告

下次我们准备用C++封装链表并且写一个马里奥移动的小练习

相关文章:

【C++】 类基础汇总(类封装,构造、析构函数...)

目录 前言 正文 类封装 为什么要进行类封装 概念 访问修饰符 构造函数 概念 特点 析构函数 概念 特点 再谈面向过程与面向对象 面向过程 代码举例 面向对象 代码举例 结语 下期预告 前言 在学习过【C语言进阶C】 C基础--让你丝滑的从C语言进阶到C 之后&am…...

BM61-矩阵最长递增路径

题目 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#xff1a; 对于每个单元格&#xff0c;你可以往上&#xff…...

selenium——unittest框架

目录 一、unittest框架基本介绍二、unittest框架解析三、unittest框架使用方法1.测试固件2.测试套件3.用例的执行顺序4.忽略测试用例中的方法5.unittest断言6.HTML报告生成 一、unittest框架基本介绍 在进行selenium IDE脚本录制导出的脚本中&#xff0c;我们发现其中多了很多…...

matlab频谱分析详解

频谱分析是一种用于分析信号频率特征的方法&#xff0c;常用于信号处理、音乐分析、谐波产生等领域。MATLAB是一种功能强大的数字信号处理软件&#xff0c;提供了许多用于频谱分析的函数和工具箱。 本文将介绍如何使用MATLAB进行频谱分析&#xff0c;包括信号预处理、选择合适…...

用layui写用户登录页面遇到的问题

用layui写用户登录页面遇到的问题 1.在layui-row下面的layui-col-md还是换行 原因&#xff1a;link标签和script标签中的type属性没写&#xff0c;导致应该是script或者这个css没有识别出来 解决办法&#xff1a;link标签里面加上type为text/css, script标签中加上type为 2…...

NMOS双向转换电路实测以及上升沿尖峰处理

NMOS双向转换电路实测以及上升沿尖峰处理 NMOS双向转换电路 &#x1f527;采用的是5V供电的STC8H单片机输出PWM波形&#xff0c;经过上面的电平转换电路测量低压端的波形。 ✨在做3.3V <>5V 电平转换电路方案验证时&#xff0c;输入5V PWM波形和输出波形的波形上升沿有尖…...

【数据结构】选择排序(详细)

选择排序 1. 直接选择排序2. 堆排序2.1 堆2.2 堆的实现&#xff08;以大根堆为例&#xff09;2.3 堆排序 3. 堆排序&#xff08;topK问题&#xff09; 1. 直接选择排序 思想 以排升序为例。以a[i]为最大值&#xff08;或最小值&#xff09;&#xff0c;从a[i1]到a[n-1-i]比较选…...

什么是企业内容管理?

为什么出现企业内容管理&#xff1f; 在数字经济的宏观背景下&#xff0c;企业建立了各种应用系统以满足企业各业务的管理需求&#xff0c;这些系统每天都在产生大量的数据和信息资源&#xff0c;但在企业实践中存在很多数据或资源无法被应用系统获取、处理和共享。 比如发票…...

机器学习:分类、回归、决策树

分类&#xff1a;具有明确的类别 如&#xff1a;去银行借钱&#xff0c;会有借或者不借的两种类别 回归&#xff1a;不具有明确的类别和数值 如&#xff1a;去银行借钱&#xff0c;预测银行会借给我多少钱&#xff0c;如&#xff1a;1~100000之间的一个数值 不纯度&#xff1…...

java常见的异常,下一篇写如何正确处理异常

当我们编写Java程序时&#xff0c;经常会遇到各种异常情况。异常是指在程序执行过程中发生的一些错误或意外情况&#xff0c;它会打断程序的正常执行流程&#xff0c;并且需要被适当地处理。在Java中&#xff0c;异常被分为两种类型&#xff1a;可检查异常&#xff08;Checked …...

C#开发的OpenRA游戏之网络协议打包和解包

C#开发的OpenRA游戏之网络协议打包和解包 OpenRA游戏里,由于这是一个网络游戏,那么与服务器通讯就缺少不了, 既然要通讯,那么就需要协议,有协议就需要对数据进行打包和解包, 这个过程其实就是序列化与反序列化的过程。 游戏里很多命令都需要发送给服务器,以便服务器同…...

K8S通过Ansible安装集群

K8S通过Ansible安装集群 K8S集群安装可参考https://gitee.com/open-hand/kubeadm-ha.git、https://github.com/easzlab/kubeasz.git 安装高可用集群 git clone https://gitee.com/open-hand/kubeadm-ha.git && cd kubeadm-ha升级内核,非必需&#xff0c;默认不升级&…...

ChatGPT辩证观点:“人才不是一个企业的核心竞争力,对人才的管理能力才是一个企业的核心竞争力”

一、问&#xff1a; “人才不是一个企业的核心竞争力&#xff0c;对人才的管理能力才是一个企业的核心竞争力”这句话的理解和误解&#xff0c;这句话有哪个中心论点转移和变化 二、ChatGPT答&#xff1a; 这句话的理解和误解&#xff1a; 理解&#xff1a;这句话的意思是说…...

windows11 永久关闭windows defender的方法

1、按键盘上的windows按键&#xff0c;再点【设置】选项。 2、点击左侧菜单的【隐私和安全性】&#xff0c;再点击列表的【Windows安全中心】选项。 3、点击界面的【病毒和威胁保护】设置项。 4、病毒保护的全部关闭 5、别人的图&#xff08;正常是都开着的&#xff09; 6、终极…...

继承的基本知识

概念 假设基于A类&#xff0c;创建了B类&#xff0c;那么称A为B的父类&#xff0c;B为A的子类 子类会继承父类的成员变量及成员函数&#xff0c;但是不能继承构造、析构、运算符重载 假设又基于B创建了C&#xff0c;那么称B为C的直接基类&#xff0c;A为C的间接基类 继承按…...

【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权)

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 代码编写开源代码搜索自己撸代码procexp确定句柄对应的文件名并过滤 2️⃣ PsExec.exe提权定位找不到EABackgroundService.exe的问题 PsExec.exe提权PsExec.exe原理 &#x1f6ec; 结论&#x1f4d6; 参考资料 &#x1f6eb; 问题…...

可视化和回归分析星巴克咖啡在中国的定价建议

可视化和回归分析星巴克咖啡在中国的定价建议。星巴克的拿铁大杯Tall 在各国的价格。 Claude AI | 代码自动生成的数据可视化代码 选择Claude AI 而非 ChatGPT的理由是前者更懂中文​&#xff01;具体可以参见我前面的两篇文章对比两者的中英文翻译的表现及使用安装等难易程度​…...

热门影片怎么买票比较便宜,低价买电影票的方法,纯攻略!

有时候真的有被自己蠢到&#xff01;看电影看了这么多年&#xff0c;竟然不知道电影票价格才9.9元、19.9元就能买到。之前我看电影动不动就是几十上百块&#xff0c;感觉好亏啊。 其实&#xff0c;我也不敢相信的&#xff0c;通过这些平台&#xff0c;同时在节假日甚至春节档期…...

Python通过SWIG调用C++时出现的ImportError问题解析

摘要 win10系统&#xff0c;编译器为mingw&#xff0c;按照教程封装C的一个类并用python调用&#xff0c;一步步进行直到最后一步运行python代码时&#xff0c;在python代码中import example时报错ImportError: DLL load failed while importing _example: The specified modul…...

3ds Max云渲染有多快,3ds Max云渲染怎么用?

本地渲染效果图和动画3D项目是一个非常耗时的过程&#xff0c;当在场景中使用未优化的几何体或在最终渲染中使用大量多边形模型时&#xff0c;诸如此类的变量最终会增加渲染项目所需的时间和处理器能力。随着提供的渲染服务的云渲染平台出现&#xff0c;越来越多动画师、艺术家…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...