cpp_class - ShenYj/ShenYj.github.io GitHub Wiki
C++中可以使用struct、class来定义一个类
-
struct和class的区别
-
struct的默认成员权限是public
struct Person { /// 成员变量(属性) int age; /// 成员函数(方法) C语言 结构体中是不能定义函数的 void run() {} }; /// 分号必不可少
struct Person { /// private 以下均私有 private: /// 成员变量(属性) int age; /// 成员函数(方法) C语言 结构体中是不能定义函数的 void run() {} }; /// 分号必不可少
-
class的默认成员权限是private
class Person { /// 成员变量(属性) int age; /// 成员函数(方法) void run() {} }; /// 分号必不可少
-
-
创建对象
/// 利用类创建对象 (不用new就是创建) Person person; /// 属性赋值 person.age = 10; /// 函数调用 person.run();
- 全局区(数据段):全局变量
- 栈空间:函数里面的局部变量
- 堆空间:动态申请内存(malloc、new等)
/// 全局区
Person g_person;
int main() {
/// 栈空间
Person person;
/// 堆空间
Person *p = new Person;
return 0;
}
没啥特别的,实例对象的成员内存布局原理都一致。
以临时栈区实例对象为例:
- 栈区内存分配特点 由高向低
- 对象内部内存配,由上向下 由低向高分配成员变量 (也就是实际越靠上的成员变量相对于下面的成员变量,内存地址要小,这样指针根据偏移量访问从上到下依次+offset访问)
相关笔记内容内容
this是指向当前对象的指针: 存储着函数调用者的地址
对象在调用成员函数的时候,会自动传入当前对象的内存地址
注意点:
this 是指针, 必须使用 this->age 的方式访问成员变量
利用指针访问对象成员的本质就是从指针取出对象地址,利用对象地址 + 成员变量的偏移量计算出成员变量地址,根据成员变量地址访问或修改
指针在调用函数的时候, 会将指针内存放的对象地址传过去, 而对象调用就是将自身的地址传给函数
函数调用时,给函数分配栈空间会被填充 cc
cc -> int3 (interrupt 3)
- interrupt 代表中断的指令
- 3 是中断码
> int3 起到断点的作用
假设 jmp jz 地址错误,跳到了函数栈空间,就会直接断住