编译器对对象的加载步骤:

  (1)类名

  (2)成员变量

  (3)成员方法

即使定义类时,成员变量写在成员方法后面,加载对象时,也是先加载成员变量

当编译器识别方法时,会对成员方法改写,在所有方法里隐藏一个this指针,用来保存当前对象的地址

在C语言中,

#include "Test.h"

using namespace std;
struct Student
{
char name[10];
int age;
char sex[3];
}; void InitStu(Student *_this, const char n[10], int a, const char s[3])
{
strcpy(_this->name, n);
_this->age = a;
strcpy(_this->sex, s);
} void main()
{
Student st;
InitStu(&st, "风清扬", 10, "男");
}

  再来看C++中this用法:

#include "Test.h"

//void Goods::RegisterGoods(Goods *this, const char name[], int amount, float price)
void Goods::RegisterGoods(const char name[], int amount, float price)
{
strcpy(Name, name);
Amount = amount;
Price = price;
}

 当对象调用

void Goods::RegisterGoods(const char name[], int amount, float price)

这个函数时,就将这个函数改写成 

void Goods::RegisterGoods(Goods *this, const char name[], int amount, float price)
this就保存当前对象
再来看看谁调用这个方法:
void main()
{ Goods c1, c2;
//RegisterGoods(&c1, "C++",10, 12)
c1.RegisterGoods("C++",10, 12);
//RegisterGoods(&c2, "C++",10, 12)
c2.RegisterGoods("Java", 5, 20); }

 c1.RegisterGoods("C++",10, 12); 执行这个函数时相当于编译器把这个调用改写成:

RegisterGoods(&c1, "C++",10, 12)
c2.RegisterGoods("Java", 5, 20);被改写成:
c2.RegisterGoods(&c2, "Java", 5, 20);
即把c1,c2对象的地址传给了this,this就保存了当前对象的地址

那么,内存中,同一个类的不同对象的内存怎么划分呢?

如上图,c1,c2,c3各自的成员变量值都不一样,所有都有自己的内存空间,而成员方法由于都是一样的,如果各自都有自己的内存空间,那就太浪费了

,那么三个对象的成员方法公用一个内存空间的话,如何区分成员函数是属于哪个对象呢?c++中,this就是用来区分不同对象的,当调用类的方法时,默认

把当前对象地址传递给this指针!跟C语言中结构体初始化有异曲同工之妙

void InitStu(Student *_this, const char n[10], int a, const char s[3])
{
strcpy(_this->name, n);
_this->age = a;
strcpy(_this->sex, s);
} void main()
{
Student st;
InitStu(&st, "风清扬", 10, "男");
}

 

this关键字理解的更多相关文章

  1. Java线程工作内存与主内存变量交换过程及volatile关键字理解

    Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模 ...

  2. 转载yield关键字理解

    实现IEnumerable接口及理解yield关键字   [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...

  3. C#中yield关键字理解

    yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码: class Program { static ...

  4. java的this关键字理解

    1.java提供了一个this关键字,this关键字总是指向调用该方法的对象.根据this出现位置的不同,this作为对象的默认引用有两种情形.a).构造器中引用该构造器正在初始化的对象.(this总 ...

  5. Java中synchronized关键字理解

    好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...

  6. C++extern关键字理解

    extern是一种"外部声明"的关键字,字面意思就是在此处声明某种变量或函数,在外部定义. 下面的示意图是我的理解. extern关键字的主要作用是扩大变量/函数的作用域,使得其它 ...

  7. lock关键字理解

    >可以把lock关键字可以看成 try{ Monitor.Enter(x); //.. } finally{ Monitor.Exit(x); } 这样子的结构,当然使用lock关键字更方便 & ...

  8. C static 关键字理解

    今天来看一下这么一个程序. #include<stdio.h> int count =1; int fun(void) { static int count =10; return cou ...

  9. Hibernate中的一些关键字理解

    ORM的理解: ORM(Object/Relation Mapping): 对象/关系映射ORM 主要解决对象-关系的映射: ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序 ...

  10. private关键字理解

    private 意思: 私有的 私人的 不公开的 private 是一个修饰符可以用来修饰成员变量和方法 被private修饰的成员变量或成员方法,只能在本类中访问,针对private修饰的成员变量, ...

随机推荐

  1. 【chatQA】nvm包版本管理

    如何使用nvm来管理不同版本的 Node.js,然后使用不同的 Node.js 版本来运行不同版本的 React 应用? 要使用 nvm 来管理不同版本的 Node.js,可以按照以下步骤进行操作: ...

  2. Javaweb学习第十二弹--Request和Response

    XML配置方式编写Servlet 3.0版本之前,仅仅支持XML配置文件的配置方式 1.编写Servlet类 2.在web.xml中配置该Servlet Request和Response Reques ...

  3. 在java中String类为什么要设计成final?Java面试常见问题

    2023Java面试题最经典的问题之一了,非常经典的Java基础知识,一定要学会! 在Java中,String类被设计成final,这意味着它的值在创建后不可更改.这是因为字符串在Java中使用广泛, ...

  4. 机器学习基础02DAY

    数据的特征预处理 单个特征 (1)归一化 归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可 ...

  5. CISCN2021东北赛区-Maple_root-WriteUp

    参赛队员: x0r,b477eRy,f1oat 总结 最终成绩:3627 最终排名:13 一血数量:3 本次比赛前期一切顺利,后期感觉被py爆了,结果名次就拉了下来,整体题目全部都偏向MISC,打的很 ...

  6. 网络计划技术——关键路线法(Python)

    关键路径法是基于进度网络模型的方法,用网络图表示各项活动之间的相互关系,获得在一定工期.成本.资源约束条件下的最优进度安排.关键路径法源于美国杜邦公司对于项目管理控制成本.减少工期的研究.1959年, ...

  7. CentOS 落幕,将于2021年底结束维护

    官方最新消息: 译文: CentOS项目的未来是CentOS Stream,明年,我们将把重点从重建Red Hat Enterprise Linux(RHEL)的CentOS Linux转移到Cent ...

  8. windows 10 家庭版安装Docker和portainer汉化版

    目录 前景提要 存在问题 一.Docker的windows版本安装 1.官网下载: https://www.docker.com/(没有本文问题的直接下载就好.) 2.本文是找到其他版本的Docker ...

  9. linux shell 自动化部署 npm vue 项目

    此 shell 是提供给前端登录服务器自动化部署 vue 项目的 用此命令,工具化部署项目,可以杜绝前端自己部署项目时,对服务器违规操作 如有其它问题,可在下方留言! #!/bin/sh # url: ...

  10. JUC(四)多线程锁

    目录 多线程锁 Synchronized锁的八种情况 公平锁和非公平锁 可重入锁 synchronized Lock 死锁 检查死锁 多线程锁 Synchronized锁的八种情况 以一个手机类为例, ...