当前位置: 首页 > 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++封装链表并且写一个马里奥移动的小练习

http://www.lryc.cn/news/66123.html

相关文章:

  • BM61-矩阵最长递增路径
  • selenium——unittest框架
  • matlab频谱分析详解
  • 用layui写用户登录页面遇到的问题
  • NMOS双向转换电路实测以及上升沿尖峰处理
  • 【数据结构】选择排序(详细)
  • 什么是企业内容管理?
  • 机器学习:分类、回归、决策树
  • java常见的异常,下一篇写如何正确处理异常
  • C#开发的OpenRA游戏之网络协议打包和解包
  • K8S通过Ansible安装集群
  • ChatGPT辩证观点:“人才不是一个企业的核心竞争力,对人才的管理能力才是一个企业的核心竞争力”
  • windows11 永久关闭windows defender的方法
  • 继承的基本知识
  • 【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权)
  • 可视化和回归分析星巴克咖啡在中国的定价建议
  • 热门影片怎么买票比较便宜,低价买电影票的方法,纯攻略!
  • Python通过SWIG调用C++时出现的ImportError问题解析
  • 3ds Max云渲染有多快,3ds Max云渲染怎么用?
  • Java之线程安全
  • 我有一个方法判断你有没有编程天赋
  • python 生成chart 并以附件形式发送邮件
  • leetcode-035-搜索插入位置
  • 读书笔记--数据治理之法
  • 送了老弟一台 Linux 服务器,它又懵了!
  • CentOS 7(2009) 升级 GCC 版本
  • java非静态代码块和静态代码块介绍
  • Golang中接口类型详解与最佳实践(二)
  • ChatGPT 探讨内存屏障的意内存
  • P1039 [NOIP2003 提高组] 侦探推理