类的定义
C++ struct:可以定义数据以及函数,一般使用class
1 | struct Student |
类的限定符以及封装
访问限定符:public,protected, private
限定符表示范围,从当前限定符开始,到下一个限定符结束,只限制成员在类外的访问,类内访问不受限制
class 定义成员默认访问权限为私有
struct 定义的成员默认访问权限是共有
建议显式的写出来,以增加可读性
类的封装:将数据和操作数据的方法有机结合,隐藏属性和实现的细节,仅对外公开接口来和对象进行交互
类的作用域:
类定义了一个新的作用域,所有类的成员都在类的作用域中。在类体外定义成员,需要使用::作为域解析符,指明成员属于哪个类域
类的实例化:
变量:对象 -—->自定义类型的变量一般习惯称为对象
类只是一个模型一样的东西,限定了类有哪些成员,定义一个没有分配实际的内存空间来存储它
一个类可以实例化多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量
类对象模型(大小)
1 | class A //4字节 |
对象模型中只存放普通的成员变量,不存放成员函数,成员函数存放在公共代码段
空类占一个字节(起到标记作用)
类的大小遵循内存对齐规则
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍地址处。 _(对齐数 = 编译器默认对齐数与该成员大小的较小值,VS默认为 8 ,Linux和当前字段sizeof值一样)_
- 结构体总大小为:最大对齐数(所有变量类型的最大者与默认对齐数取最小)的整数倍。
- 如果存在嵌套,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍处。
!!!!如果嵌套的结构体只有定义,那么算大小的时候不算它!!!!!
1 | class A //48 字节 |
为什么要内存对齐?
答:提高访问效率,CPU读取内存是按块读取的,内存对齐可以提高访问效率,方便一些硬件(如嵌入式)读取数据
如何修改内存对齐数:#pargma pack()
this 指针
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该 指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this 指针类型:类类型* const
this指针只存在于成员函数中
this指针始终作为成员函数的第一个行参
this不是类的成员,只是一个函数行参,一般存在于栈上,一般会做优化,存在寄存器中
有解引用的情况下this指针不能为空!