1.类的引入及介绍
类是由结构体引入的,或者说类是结构体的升级版。c++兼容C语言结构体的所有用法,下面是类对于结构体的升级(以栈为例):
1.可以在结构体里定义函数,我们把类中的函数叫做成员函数,其他数据叫做成员变量。在类中定义的函数有如下特性:
1)之前初始化栈都要把栈的传参到 Init 函数中,但现在因为函数就在栈里,所以不用传有关栈的参数了(如需要其它参数,传进去便是)。在这里提一下,n是前面说到的全缺省参数,通过n可以在初始化时直接把数组空间开到合适大小,省去了扩容多次的时间,当然你也可以不穿参,这样n就是1了。
2)函数的使用:
3)成员函数不计入类的整体大小。每定义一个类都要存下函数指针这样会浪费太多空间。而为了解决这个问题,c++把类里的函数存在一个特定的公共区域(代码段),供所有对象使用。计算对象大小时不计入函数。(如果一个类中没有除函数外的数据,那么它的对象的大小是1字节,这个字节不存东西,只是表示这个对象被定义出来了)
4)注意一下,一般来说函数名就是函数地址,但规定成员函数的地址是&加函数名。
2.在使用结构体时可以省略掉struct直接用结构体名字,如:
3.比起struct,c++更倾向用class定义类(包容结构体)
4.类增加了访问限定符。
访问限定符可以限定类成员是否可以在类外访问(就像这样:st1.top)。
访问限定符有三种:private,protected,public。在初阶你可以把private和protected看做都是私有(不可访问),public为公有(可以访问)。
使用:
5.类的定义和声明的分离(主要是针对函数)
![](https://img-blog.csdnimg.cn/direct/8a746a711b86427987cc88bad64717de.png)
![](https://img-blog.csdnimg.cn/direct/1c6bf1dd3ce04f8ab0b64d30799fee2d.png)
2.类的封装特性
之前我们用结构体只能存数据,数据和处理数据的方法是分开的,而类让数据和处理数据的方法封装在一起,并且类可以实现访问权限的控制,只留下统一的访问路径(接口),便于管理。
就像计算机,把内部的构造用壳子包起来,只留下键盘,鼠标,等接口让我们操作。
3.类的实例化
类是一张建筑图纸,我们构造类的时候并没有为其分配空间。而定义一个类的变量就是按照这个图纸建造房子,这时候才开辟空间。定义类的变量的过程就叫类的实例化,这个变量叫做对象,一个类可以定义多个对象。
4.为什么结构体和类都要内存对齐?
由于硬件上的设计,计算机读取数据时不论数据大小一次性读取固定字节数(假设是4)
![](https://img-blog.csdnimg.cn/direct/9a7866b9c1394b43a32dd6462d549d72.png)
这是内存对齐:
效率一目了然。
知识点:#pragma pack(x) 可以把对齐数设为x(整数)。
5.隐含this指针(比较重要)
前面讲过,类里面的函数都放在公共区域,而且Print貌似也没有接受参数,那么两次调用Print函数为什么得出不一样的结果呢?答案是编译器实际上背着我们给被调用的函数传递了类的指针——this,只是我们看不到。如下:
绿色部分就是编译器省略的!!
虽然不能显式的写但在类里面可以显式的用,如下:
看,this在函数中使用并不会报错。
有关this指针的题型:
1.this指针存在哪儿?
答:this指针是被调函数的形参,而形参存在于栈区。不过有时也存在于寄存器中,方便快速取出使用。
2.this指针可以为空吗?
答:可以,只要不去解引用(使用它访问对象数据)它是不会报错的。
3.
首先,空指针问题的话,不可能报编译错误,因为它也是指针,符合语法,但是一但使用空指针就会报运行错误。
然而,分析这个题目,Printf函数不存在于对象内,所以p没有访问对象中的变量,进入Print函数后,也没使用p指针(this指针)访问对象内容,所以这个程序是正确的。
选c
4.
前面分析与第三题一样,但是,把隐藏的this显示出来,_a相当与this->a,使用了this(空指针)
选B