c++ 类的本质与this

例如:

1: 人体结构: 头,手, 足, 身体 –人体的结构描述;
2: 人类跑步程序:
摆动手臂
带动双脚
均匀呼吸;
3: 人体结构实例 小明:
小明的头, 小明的手;
小明的足,小明的身体;
4: 小明跑步:
使用人类跑步的方法和逻辑来操作小明实例的身体;
5: 类的实例的内存:
包括了每个数据成员, 不包括成员函数;
每个成员函数都是固定的,只是通用的逻辑,通用的程序;


c++ 类的本质与this

本质是什么

  • 类的实例的内存:类里面所有数据成员的和,不包括成员函数,类的实例定义在哪里,内存就分配在哪里;
    • c++ 类的本质与this
  • 成员函数是什么呢?
    • 是全局唯一的函数逻辑,通用的逻辑;
    • 通过实例的不同来完成,操作不同的实例,完成这个逻辑;
    • c++ 类的本质与this
  • 所以使用sizeof(类名),sizeof(实例名字),实例(类型)可以求得内存大小;
    • c++ 类的本质与this
  • 每个实例.方法:通用逻辑使用实例的结构成员,来完成它的逻辑;
  • 成员函数:分配在代码段上的全局唯一函数;
    • 函数名字:(homan::walk); //其它类也可以使用这个名字

类的本质

1: this指针: 类的实例在调用类的成员函数的时候,会在调用函数之前绑定好实例指针到this;
2: 成员函数访问类的实例的成员的时候,实际是使用这个this指针来访问成员;
3: C语言编写的函数与类的比较:
(1)类的成员函数也只是一个函数而已,名称是类名::函数名字();
(2)类的实例.成员函数(); 会隐式的把实例的地址绑定到this;
(3) 成员函数访问实例的数据成员,隐藏了this,实际是this->成员数据;
(4)我们鼓励显示的使用this->访问实例的数据成员,区别于成员函数的参数和局部变量,让你一眼就明白你访问的是成员变量;


  • C语言版本的函数描述多了:实例指针;
    • c++ 类的本质与this
  • 以上例子,是类的等价描述;
  • C++语言的版本函数描述,不用这个;
    • 真的不用这吗?
    • c++隐式的传递这个类的实例指针;
    • 怎么传递:
      • c++里面有一个特定的机制,this;
      • 类的实例调用成员方法的时候:编译器会为我们指定好this所指的对象;
      • 实例.方法(); 编译器会把this 绑定成 实例的地址,实例指针->方法();
      • 编译器会把this 绑定成实例的指针;
      • c++ 类的本质与this
      • 每次使用实例.成员 ,调用的时候,都会先把实例的指针,绑到成员函数里面的this,实际在成员函数里面访问的数据成员 this-> 数据成员来访问的,只不过c++里面可以省略这个this;
      • 可以通过this,来访问当前调用这个成员函数的实例;
      • this实现:实际上是画出一个寄存器,来存放实例的地址;
      • 寄存器在成员函数调用的时候,编译器不会让它做别的,只会保存this;
      • vs的–>this,是由ecx寄存器来完成的;

  • 在编写c/c++的时候,尽量显示的使用this;
  • 为什么?
    • 一眼就分辨出,是局部变量,参数,成员变量;
    • 为什么要区分,因为成员变量的修改和使用,会影响其它成员函数的使用;
    • c++ 类的本质与this

总结

1: 理解类的实例的内存分布;
2: 理解成员函数的本质;
3: 理解this指针;


–>源代码