目录
前言
正文
类封装
为什么要进行类封装
概念
访问修饰符
构造函数
概念
特点
析构函数
概念
特点
再谈面向过程与面向对象
面向过程
代码举例
面向对象
代码举例
结语
下期预告
前言
在学习过【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++封装链表并且写一个马里奥移动的小练习