文章目录
- 1、类的定义格式
- 2、访问限定符
- 3、类域
- 4、类的实例化
- 5、对象的大小
- 6、this指针
- 7、谢谢观看!
1、类的定义格式
其中class为定义类的关键字,jyan为类的名字,{}中为类的主体。
注意类定义结束时不能省略后面的分号。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。
为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_或者 m开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。
C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是struct中可以定义函数,一般情况下我们还是推荐用class定义类。定义在类面的成员函数默认为inline(内联函数)。
2、访问限定符
三种访问限定符:public 、 protected、 private。
说明:public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,目前来说,protected和private是一样的,以后继承章节才能体现出他们的区别。
- 限定范围:访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 } 即类结束。
- class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
- 一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。
由于,C++中可以使用struct来定义类,这里来和C语言做一个区分:
(C++兼容C语言,故在C++中,以上两种方式均可)
3、类域
- 类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
- 类域影响的是编译的查找规则,不影响生命周期。
4、类的实例化
一个类可以实例化多个对象。
类比盖房子,类就像是一个房子的设计图,而对象就是根据设计图而盖的房子,工程者可以根据图纸盖出多座框架相同的房子。
类定义了实例化的对象具有哪些属性,但图纸不是具体的房子,还不能住人。只有实例化成对象后,才可以住人!
5、对象的大小
类的对象大小和C语言基本相同,均要遵循内存对齐规则:
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
- 注意:对齐数=编译器默认的一个对齐数 与 该成员大小的较小值。
- VS中默认的对齐数为8
- 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
(C语言篇已详细讲解,这里不过多赘述)
为什么要内存对齐?
空间换时间,方便查找:cpu读取内存中的数据时,不是从任意位置开始读,现代处理器通常以 字长(如32位系统为4字节,64位系统为8字节)为单位访问内存。(主要原因)
注:没有成员变量类对象的大小是1,为什么没有成员变量还要给1个字节呢? 因为如果一个字节都不给,无法表示对象存在过!所以这里给1字节,纯粹是为了占位标识对象存在。
6、this指针
引入:请看以下代码
#include <iostream>
using namespace std;//类
class jyan
{//声明,不开空间int _year;int _month;int _day;//方法
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
};int main()
{jyan aa;aa.Init(2025,3,20);aa.Print();jyan bb;bb.Init(2025, 3, 21);bb.Print();return 0;
}
问:jyan类中有 Init 与 Print两个成员函数,函数体中没有关于不同对象的区分,那当aa调用Init和Print函数时,该函数是如何知道应该访问的是aa对象还是bb对象呢?
答:C++给了一个隐含的this指针解决这里的问题。
- 编译器编译后,类的成员函数默认都会在形参第一个位置,增加一个当前类类型的指针,叫做this指针。比如jyan类的Init的真实原型为,void Init( jyan*const this,int year,int month,int day)
- 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值,this->_year = year;
- C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。
传了地址,就可以准确知道对应的参数的值。
而函数里面的访问是通过this访问的,只是被隐含了:
this指针可以在函数体内使用,但不可以在参数部分使用!
this指针存放在栈帧中