this关键字理解
编译器对对象的加载步骤:
(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关键字理解的更多相关文章
- Java线程工作内存与主内存变量交换过程及volatile关键字理解
Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模 ...
- 转载yield关键字理解
实现IEnumerable接口及理解yield关键字 [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...
- C#中yield关键字理解
yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码: class Program { static ...
- java的this关键字理解
1.java提供了一个this关键字,this关键字总是指向调用该方法的对象.根据this出现位置的不同,this作为对象的默认引用有两种情形.a).构造器中引用该构造器正在初始化的对象.(this总 ...
- Java中synchronized关键字理解
好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...
- C++extern关键字理解
extern是一种"外部声明"的关键字,字面意思就是在此处声明某种变量或函数,在外部定义. 下面的示意图是我的理解. extern关键字的主要作用是扩大变量/函数的作用域,使得其它 ...
- lock关键字理解
>可以把lock关键字可以看成 try{ Monitor.Enter(x); //.. } finally{ Monitor.Exit(x); } 这样子的结构,当然使用lock关键字更方便 & ...
- C static 关键字理解
今天来看一下这么一个程序. #include<stdio.h> int count =1; int fun(void) { static int count =10; return cou ...
- Hibernate中的一些关键字理解
ORM的理解: ORM(Object/Relation Mapping): 对象/关系映射ORM 主要解决对象-关系的映射: ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序 ...
- private关键字理解
private 意思: 私有的 私人的 不公开的 private 是一个修饰符可以用来修饰成员变量和方法 被private修饰的成员变量或成员方法,只能在本类中访问,针对private修饰的成员变量, ...
随机推荐
- 【QCustomPlot】简介
说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记. 目录 说明 1. 库简介 2. 库的官网链接 3. 库的帮助文档 4. 库的下载地址 5. 库的版本号说明 6. 库的 Git 地 ...
- 基于Kubernetes(k8s)部署Dubbo+Nacos服务
一.说明 本文介绍基于 Kubernetes(k8s) 环境集成阿里云 私有镜像仓库 来部署一套 Dubbo + Nacos 的微服务系统,并使用 Kubernetes DNS 以及 port-for ...
- Linux & 标准C语言学习 <DAY11>
一.指针 1.什么是指针 指针是一种特殊的数据类型,使用指针可以定义指针变量,指针变量存储的是整形数据,该数据代表了内存的编号(地址),可以通过这个编号访问到对应的内存 ...
- day05-2-yaml
yaml 1.yaml介绍 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发这种语言时,YAML的意思其实是 ...
- SqlServer 高并发的情况下,如何利用锁保证数据的稳定性
sql的锁机制,是时刻贯彻在每一次的sql事务中的,为了理解更透彻,介绍锁之前,我们得先了解,锁是为了干什么!! 1.数据库异常情况 1.1 先来聊聊数据可能发生个异常状况 1)脏读:读未提交,顾名思 ...
- vmware workstation 版本合集
各版本序列号 10.x:1Z0G9-67285-FZG78-ZL3Q2-234JG 11.x:YG74R-86G1M-M8DLP-XEQNT-XAHW2 12.x:ZC3TK-63GE6-481JY- ...
- Solon2 自定义 slf4j 日志添加器
本案需要引入已适配的 slf4j 日志框架(solon.logging.simple 或 logback-solon-plugin 或 log4j-solon-plugin). 1.自定义添加器入门 ...
- GO实现Redis:GO实现Redis集群(5)
采用一致性hash算法将key分散到不同的节点,客户端可以连接到集群中任意一个节点 https://github.com/csgopher/go-redis 本文涉及以下文件: consistenth ...
- AcWing 1353. 滑雪场设计
原题链接 思路 本题如果以贪心的思路来理解,则会遇到如果根据贪心算法变更后的最高峰和最低峰会发生改变,产生后效性,导致贪心算法无效,再考虑到本题目数据量不大,山峰数量在1k以内,山峰高度在100之内, ...
- pandas之缺失值处理
在一些数据分析业务中,数据缺失是我们经常遇见的问题,缺失值会导致数据质量的下降,从而影响模型预测的准确性,这对于机器学习和数据挖掘影响尤为严重.因此妥善的处理缺失值能够使模型预测更为准确和有效. 为什 ...