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();

对象的内存布局

对象的内存可以存在于3种地方

  • 全局区(数据段):全局变量
  • 栈空间:函数里面的局部变量
  • 堆空间:动态申请内存(malloc、new等)
/// 全局区
Person g_person;

int main() {
    /// 栈空间
    Person person;

    /// 堆空间
    Person *p = new Person;

    return 0;
}

没啥特别的,实例对象的成员内存布局原理都一致。

以临时栈区实例对象为例:

  1. 栈区内存分配特点 由高向低
  2. 对象内部内存配,由上向下 由低向高分配成员变量 (也就是实际越靠上的成员变量相对于下面的成员变量,内存地址要小,这样指针根据偏移量访问从上到下依次+offset访问)

.

相关笔记内容内容

this

this是指向当前对象的指针: 存储着函数调用者的地址

对象在调用成员函数的时候,会自动传入当前对象的内存地址

注意点:

this 是指针, 必须使用 this->age 的方式访问成员变量

指针的本质

利用指针访问对象成员的本质就是从指针取出对象地址,利用对象地址 + 成员变量的偏移量计算出成员变量地址,根据成员变量地址访问或修改

指针在调用函数的时候, 会将指针内存放的对象地址传过去, 而对象调用就是将自身的地址传给函数

0xCC

函数调用时,给函数分配栈空间会被填充 cc

cc -> int3 (interrupt 3) - interrupt 代表中断的指令 - 3 是中断码 > int3 起到断点的作用

假设 jmp jz 地址错误,跳到了函数栈空间,就会直接断住

⚠️ **GitHub.com Fallback** ⚠️