目录
一、类与对象的初步认知
在学习c语言时,想必很多人都听到过面向过程和面向对象这两个词。但是受限于当时对语言的认知,一般不会对其进行了解。但是到了C++学习类与对象时,我们就要对“面向过程”和“面向对象”这两个词有一个初步的认知。
1.面向过程和面向对象的初步认识
(1)面向过程
我们常说c语言是面向过程的语言,那么面向过程是什么意思呢?简单来讲,就是指c语言在使用中关注的是过程,即分析出求解问题的步骤,通过函数调用逐步解决问题
以洗衣服为例子,如果用c语言解决洗衣服这一问题,那么我们就需要经过如下几个步骤:
这每一个步骤都可以看做是一次函数定义和函数调用。可以看到,用c语言来写就会非常的复杂,每一个步骤都需要自己去完成。
(2)面向对象
而C++是面向对象的,关注的是对象。这里的对象指的就是C++会将一个问题分解为不同的部分,每个部分交给不同的对象,靠对象之间的交互完成。
同样以洗衣服为例,在C++中,洗衣服就可以看成如下图所示:
C++要解决洗衣服问题,就会将其划分出四个对象,分别是“人、衣服、洗衣服和洗衣机”,将整个问题交给这四个对象来完成。
二、类的引入
1.C++中的struct
(1)C++中的struct与C中struct的不同
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:如果我们用C语言方式实现的栈,结构体中只能定义变量。但是在C++中,结构体struct中也可以定义函数。
struct Stack
{
void Init()
{
data = nullptr;
top = 0;
capacity = 0;
cout << "Init" << endl;
}
void Push()
{
cout << "Push" << endl;
}
int* data;
int top;
int capacity;
};
在上面的程序中我们可以看到,在C++中的struct既可以定义变量,也可以定义函数。
(2)C++中的struct特性
struct Stack
{
void Init()
{
data = nullptr;
top = 0;
capacity = 0;
cout << "Init" << endl;
}
void Push()
{
cout << "Push" << endl;
}
int* data;
int top;
int capacity;
};
1.同一个struct中的变量可在内部随意使用
同样以上面的程序为例,我们可以看到,在struct中定义的函数Init()中我们使用了在struct中定义的data、top等变量。这是为了能够更加方便的在结构体内定义函数
2.同一个结构体中的变量的位置没有固定要求
从上面的程序我们可以看到,定义在结构体中的变量并没有像以前那样放在函数的最上面,而是放在了最下面。但是这个结构体依然可以正常使用。原因是struct中的函数在调用变量时会先从其函数内部找,找不到时再在整个结构体中去寻找,而不是像以前那样只从函数的上面查找。这样就避免了struct中的变量一定要放在函数上面的问题。
2.C++中的class
(1)类的定义
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面的分号不能省略。
类体中的内容为类的成员,类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数
基本形式如图所示:
(2)类的访问限定符及封装
1.访问限定符
访问限定符,顾名思义就是用来限制访问的符号。而类的访问限定符就是用来限定对类的访问。这里的访问限定符就涉及到了C++的封装。
在C++中,实现封装的方式是用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
类中提供了三种访问方式:public、protected、private。即如图所示
2.访问限定符说明
(1)public
public的英文释义为公有,在C++中,由public修饰的成员在类外可以直接被访问
(2)protected和private
protected和private的英文释义分别有保护和私有的含义。private所修饰的成员在类外不能直接被访问。而protected与private的作用是类似的,但目前阶段我们不能完全理解protected的作用,可以暂时理解为和private的作用相同
从上图中可以看到,当我们在类外调用由private修饰的类成员时,程序直接报错了,这也说明了这些由private修饰的成员是不能在类外被直接访问的
(3)访问权限作用域
在类中,一个访问权限的作用域是从该访问限定符出现的位置开始直到下一个访问限定符出现为止。如果后面没有访问限定符,作用域就到},即类结束
从上面的两张图中我们可以看到,第一幅中只有一个public修饰,因此public的作用域就是直到这个类的结尾;而第二幅中存在public和private两个访问权限&#x