目录
一:类的定义格式
class+类名,所谓的类其实就类似于c语言中的结构体。除了class,也可以用struct来定义类。
不同点:class定义的类中的成员变量默认为private,struct默认为public。
定义在类里的成员函数默认为内联函数。
二:实例化
⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。打个⽐⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房⼦才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。
三:访问限定符
这里的private与public叫做访问限定符,被pubilc修饰的变量可以从类外部进行访问而private则不能从类的外部进行访问。 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到}即类结束。
注意:在类的内部成员变量不管是不是被private修饰都可以随便使用。
在c++中类名就可以当做类型来创建变量。在c++中叫作实例化对象。如图:
四:类域
类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作⽤域操作符指明成员属于哪个类域。
类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
五:this指针
指向对象的指针。
如图在d1.Init()处实际上有一个this指针用来传达d1地址。只是c++规定this指针不能显示使用。但可以在成员函数中使用this->访问eg:this->_year。
编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this
指针。⽐如Date类的Init的真实原型为, void Init(Date* const this, int year,
int month, int day)。
类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this-
>_year = year;
如图该代码p为空指针但代码却能正常运行,是因为实际上并没有解引用nullptr在汇编底层中实际是call函数地址,只要不解引用空指针就不会有什么问题。
但如图如果想要打印_a则需要解引用导致程序崩溃。
实际上同一个类实例化出不同的对象后,他们对象中的同名函数都是同一个地址但变量则各有各的地址。