前言
都说Cpp是面向对象的语言,今天我终于开始学习类和对象了。
一,面向对象与面向过程的区别
面向对象与面向过程有什么区别呢?比如说你要洗衣服吧:
面向过程是这样的:
人——》把衣服放到洗衣机——》放入洗衣粉——》启动洗衣机开始洗衣服——》洗完后从洗衣机里拿出来——》晒干——》收起来。
面向对象就只需要关注四个对象:人,洗衣粉,洗衣机。
这就是两者的不同。看起来面向对像比面向过程轻松了不少。
二,类
在C语言中,有一个叫做Struct的东西叫做结构体。例如在C语言中我要定义一个栈:
struct stack { int* a; int top; int size; };
我就要用一个结构体来定义,这个结构体里面的成员便有三个:
1.指针变量a。
2.表示栈顶元素的下标top。
3.表示栈内数据个数的size。
虽然在C++中我们也可以使用struct定义栈,但是使用C++会更加的时候我们会更加倾向于使用类class来定义一个栈:
class stack { int* a; int size; int capacity; };
这个class便是类。其实struct也是一个类,但是struct和class还是有区别的!!
二,访问限定符
其实struct和class没有啥本质的区别,但是它们两个还是有小小的区别的。区别就在于,struct的默认访问权限是public而class的默认访问权限是prvate。所以在C++中就要加入一个叫做访问限定符的概念,在C++中访问限定符有三种:
1.public.
2.protected.
3.private.
在C++中我们的栈便是这样子写的:
class stack { public://函数公开化 void Init() { int* tmp = NULL; if (top == capacity) { int newcapacity = capacity == 0 ? 4 : 2 * capacity; tmp = (int*)realloc(a, sizeof(int) * newcapacity); } if (tmp == NULL) { perror("malloc fail"); return; } a = tmp; } //…… void Destory() { free(a); capacity = top = 0; } private://成员私有化 int* a; int top; int capacity; };
其中的访问限定符便规定了类里面的那些东西是可以被外面访问的,那些是不能被外面访问的。其中访问限定符对于类里面的调用是没有限制的,所以定义的函数就可以调用类里面私有的变量。
三,封装性
类访问限定符的出现,便让类有了封装性。私有的变量就像是笔记本电脑里的电路板,在外面我们是不能够看见笔记本电脑的内部的电路板的。而公共的变量就像是一个一个的接口,通过这个接口便可以让外面的电流流到笔记本电脑内部的电池当中完成充电。
四。类的大小
如果我问这个stack类的大小是多少,你知道吗?可能有人会很迷惑,但是这个类的大小其实非常的容易算,来看答案:
答案就是十二个字节的大小。直白的说,这其实就是ST这个栈里面三个变量a,top,capacity内存对齐以后的大小,函数的大小是不被放到类里面去计算大小的。那问题来了,为什么函数的大小不被放到类里面去计算大小呢?这个函数放到了哪里呢?
五,实例化
用类去定义一个对象的过程就叫作一个实例化的过程。类就像一张图纸,而实例化就是用这个图纸建房子的过程。在中国一个普通的小区里,花园会建造几个呢?广场会被建造几个呢?是不是一个啊?但是是不是每一套房都会有独属于自己的房间啊?所以,类里面的函数就像广场这些公共的场所一样只能有一个,但是类里面的变量就像房间一样每个变量都要必须要有的。
六,this指针
this指针是一个比较隐蔽的指针,在函数参数中是不会显示的出现的但是却能在函数的内部用起来。this指针的特点:
1.this指针的类型是类指针。
2.this指针不能在函数的形参处显示出来。
3.this指针可以在函数内部使用。
如栈里面的Init函数:
void Init() { int* tmp = NULL; if (top == capacity) { int newcapacity = capacity == 0 ? 4 : 2 * capacity; tmp = (int*)realloc(a, sizeof(int) * newcapacity); } if (tmp == NULL) { perror("malloc fail"); return; } a = tmp; }
这个函数虽然看起来没有传入任何的参数,但是其实是有传入一个stack* this的指针的。但是我们看不见这个this指针。但是在函数内部是可以用的:
也可以用typeid.name( )来确定this指针的类型:
this指针的类型便是类指针类型。