当前位置: 首页 > 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;越来越多动画师、艺术家…...

5分钟掌握Scala.js构建工具链:从开发到生产的完整指南

5分钟掌握Scala.js构建工具链&#xff1a;从开发到生产的完整指南 【免费下载链接】scala-js Scala.js, the Scala to JavaScript compiler 项目地址: https://gitcode.com/gh_mirrors/sc/scala-js Scala.js是一个功能强大的Scala到JavaScript编译器&#xff0c;它允许开…...

嵌入式工程师职业发展:原厂与方案商技术深度对比

1. 嵌入式工程师的职业抉择&#xff1a;原厂与方案商深度对比最近一位工作三年的嵌入式工程师朋友分享了他的求职经历&#xff0c;让我感触颇深。他在方案商做了三年应用开发后&#xff0c;最终选择跳槽到芯片原厂。这个决定背后&#xff0c;反映了很多嵌入式工程师都会面临的职…...

保姆级教程:用SNAP处理哨兵2号L1C数据,5分钟搞定大气校正生成L2A

零基础实战&#xff1a;SNAP快速处理哨兵2号L1C数据的完整指南 当第一次拿到哨兵2号L1C级数据时&#xff0c;很多研究者都会面临一个共同问题&#xff1a;如何高效地将原始数据转换为可直接用于分析的表面反射率产品&#xff1f;本文将手把手带你完成从数据准备到大气校正的全流…...

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾遇到这样的尴尬场景&#xff1a;购买了心仪的PS4或PS5手柄&#xff0c;想在PC上畅…...

Android 14 ShellTransitions 实战:手把手教你理解 Transition 如何“抓取”动画参与者(WindowContainer 篇)

Android 14 ShellTransitions 深度解析&#xff1a;WindowContainer 动画参与者捕获机制实战指南 在 Android 14 的动画框架革新中&#xff0c;ShellTransitions 引入了一套精密的"参与者捕获"系统&#xff0c;其运作机制堪比特种部队的精准行动。本文将带您深入这套…...

计算机毕业设计:Python地铁运营数据多维分析与智能管理平台 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…...

AI赋能算法创新:让快马大模型为你的智能车竞赛方案提供灵感

AI赋能算法创新&#xff1a;让快马大模型为你的智能车竞赛方案提供灵感 智能车竞赛一直是技术爱好者展示创新能力的舞台&#xff0c;但面对复杂的赛道和实时控制需求&#xff0c;很多队伍在算法设计上容易陷入瓶颈。最近我在准备比赛时&#xff0c;发现InsCode(快马)平台的AI辅…...

FNF-PsychEngine完全指南:从零开始打造你的音乐游戏

FNF-PsychEngine完全指南&#xff1a;从零开始打造你的音乐游戏 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF-PsychEngine是一款功能强大的Friday Night Funkin开源游…...

2026最权威的十大降AI率工具横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 凭借人工智能技术来辅助撰写开题报告&#xff0c;能极大程度显著提升文献梳理以及框架搭建的…...

从电桥到差分放大:三线制PT100测温电路的设计实践与精度考量

1. 三线制PT100测温电路的设计背景 温度测量在工业自动化、医疗设备、环境监测等领域都是基础且关键的技术需求。PT100作为一种广泛使用的铂电阻温度传感器&#xff0c;凭借其优异的线性度和稳定性&#xff0c;成为高精度测温的首选之一。但在实际应用中&#xff0c;如何准确测…...