一、类的两种定义方式
1、声明定义都放在类内部,成员函数放在类内部,编译器可能将其当作内联函数处理
2、声明定义分离,注意函数模板声明和定义不可分离
二、访问限定符
1、public修饰可供类外部访问
2、protected、private类外不能直接访问,这一点两者相同
3、作用域在两个访问符之间
4、class默认是private,struct默认为public
三、C++中class和struct区别
1、struct在C++和C语言中,都可以当作结构体使用,在C++中还可以用来定义类
2、class默认是private,struct默认为public
四、封装
将数据和操作数据方法有机结合,隐藏对象属性和实现细节,仅对外提供公开接口供外部访问
五、类对象存储方式
1、成员变量在对象中,成员函数在公共代码段,static在静态数据区,不计入对象大小
2、对于空类,编译器给其一个字节来标识这个类
六、结构体对齐
对齐方式:
1、第一个成员放在结构体偏移量为0的地址
2、其他成员变量对齐到对齐数的整数倍(对齐数=编译器默认对齐数与该成员大小较小值)
3、结构体总大小为最大对齐数整数倍
4、嵌套结构体对齐到自己的最大对齐数的整数倍,整体大小为最大对齐数的整数倍
作用:
各个硬件平台对存储空间的处理有很大的不同,一些平台对某些特定类型的数据只能从某些地址开始存取,如果不按要求方式存储,可能会对存取效率造成影响,之前读一次的可能要两次才能拿到
如何修改默认对齐数:
使用#pragma pack设定对齐数
七、this指针
1、类型:类类型* const,因此this指针不可更改
2、只能在成员函数内部使用,因为只有成员函数参数有this指针
3、对象中不存储this指针,通过ecx寄存器传递
4、对于空this指针是否出错,主要看调用函数是否访问类成员,如果不访问不会出错,访问会出现空指针错误
5、类静态成员函数没有this指针,因此无法调用类的非静态成员
八、编译器编译类的步骤
1、识别类名
2、识别类成员变量
3、识别类的成员函数并进行修改,为每个成员函数添加this指针