C++基础之详解this指针(有,或者没有,这不是个问题)

这两天我发现,带着问题更能清楚的了解一个东西,问题越细越多,就会了解的很透彻,根本不需要记忆,现在想想摆脱了死记硬背有多舒服

问题1:this指针指针是什么?

问题2:为什么这个指针叫this?

问题3:this指针指针是干嘛的?

问题4:this指针有没有空间?如果有,在哪里?

问题5:this指针是在哪里用的?

问题6:this指针的实现机制是什么?

遗留1:暂时先当做是叫做this的一个指针(需要下面的问题铺垫才能知道)

遗留2:(需要下面的问题铺垫才能知道)

解决3:类里的成员变量或者是成员函数的调用方式是this调用,意思是用本类的对象调用,this指针相当于是本类的对象

解决4:指针是有空间的,更何况我在解决3里说this就是本类对象(解决3说的是相当于,你这里说的是“就是”,冲突啊),对象是类的实例化,怎么会没空间,空间再哪--------------呢?new出来的对象,this的空间再堆上,直接建的对象,this的空间在栈上

解决5:this是本类的对象,在类里面出没,在类里面使用成员变量或者成员函数,可以直接用,前面略写了一个this,可写可不写,你也可以自己加上,例如但有的情况下是必须写的,例如楼主这两天一直在干的事就是封装线程,扩展功能,想要在线程的回调函数里面用成员函数,无奈线程回调函数的调用方式是普通调用,我只能把this传到线程回调函数里面来使用成员函数

解决6:解析两幅汇编图,前提,fun()和a都是FKOne的成员

图一,01351047看到了this,图二是在反汇编里取消了显示符号名,可以看得到出this是ebp-4

1.建了这个类的对象,开辟空间,esp的位置就是对象地址的末尾,这个类有一个成员变量,那这样esp的位置是这个成员变量的后面,也就是这个对象首地址+4个字节后面

2.01351041把esp的值给ebp

3.ebp-4就是这个类的对象的首地址,说明了所谓的this就是对象的首地址,也说明了调成员变量或函数都是通过对象首地址(这里可以看得出this的功能和是个什么,继续深入)

4.我说this是假的,根本没有这个this指针,我在汇编上看不到指针这个东西,看到的就是ebp-4而已------------没有this这个东西

5.我说this是真的,指针的存在就是保存的东西以地址来解释,ebp-4不就是对象的地址,01351047可以看得出把对象的首地址放到eax寄存器中,那这个时候eax里面是对象的首地址,eax不是就是一个指针(这里说到了this的实现机制,就是把对象的地址放在寄存器里,然后使用寄存器来找成员函数或者成员变量,根本没有this这个东西,但我5里也说有这个东西,看到这,不知道你有没有看明白,我这篇文章标题的意思,这里也解决了遗留的1和遗留的2,遗留2,this英文解释就是这个类里才能使用,也解决了我上面为什么说相当于)--------有this这个东西

(PanPen120原创,如有建议,轻留言)

时间: 2024-10-12 16:08:46

C++基础之详解this指针(有,或者没有,这不是个问题)的相关文章

halcon基础数据类型详解

#if defined(__CHAR_UNSIGNED__) || defined(__sgi) #define INT1 signed char /* integer, signed 1 Byte */ #define INT1_MIN SCHAR_MIN #define INT1_MAX SCHAR_MAX #else #define INT1 char /* integer, signed 1 Byte */ #define INT1_MIN CHAR_MIN #define INT1_M

Nmap扫描教程之基础扫描详解

Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在实施这些扫描工作之前,需要先简单了解下Nmap工具的使用,以方便后面实施扫描.所以,本章将通过使用Nmap工具实施基础的扫描,来帮助用户了解该工具. Nmap扫描扫描概述 在实施基本的扫描之前,需要先了解一些Nmap网络扫描的基本知识,及需要考虑的一些法律边界问题.本节将对网络基本扫描进行一个简单介

jmeter 基础功能详解

jmeter 基础功能详解 thread group:包含一组线程,每个线程独立地执行测试计划. sampler:采样器,有多种不同的sample实现,用来发起各种请求,如http请求,jdbc请求,javaTest请求等等. logic controller:逻辑控制器有多种不同的实现,可以决定每个sample的执行顺序. listener:有多种不同的实现,主要用于统计测试接话运行中的数据并展示,如可以进行图形化方式展示响应时间. timer:定时器,有多种不同的实现,可用作每个请求见的停顿

Linux上命令的使用格式和基础命令详解

一.Linux上命令的使用格式 命令行提示符详解: 用户通过终端的命令行接口来控制操作系统,登陆后如下: [[email protected] ~]# root: 当前登录的用户 @:分隔符 localhost: 当前主机的主机名,非完整格式:此处的完整格式为:localhost.localdomain [[email protected] ~]# hostname localhost.localdomain ~:用户当前所在的目录(current directory),也称为工作目录(work

高性能Web服务之tomcat基础应用详解(一)

Tomcat概述: Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范.因为Tomcat 技术先进.性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目

varnish基础概念详解

varnish基础概念详解 比起squid更加轻量级,大致有以下几个特点: ·可以基于内存缓存,也可以在磁盘上缓存,但是就算存放在磁盘上,也不能实现持久缓存 只要进程崩溃,此前缓存统统失效,无论是在内存还是在磁盘,但是现在已经具备持久缓存功能,但是仍然在实验阶段,经常容易崩溃,而且最大大小不能超过1G 如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或SSD X 2 做RAID 避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如

Tomcat基础配置详解

Tomcat基础配置详解 组件原理图如下: 任何tomcat实例就是一个server,而一个server内部要想能够解析jsp页面转义编译serlet程序,要靠其引擎来实现 而引擎才是真正意义上执行jsp代码的容器,都是tomcat用类来描述这些组件的 同时,为了接受用户的请求,需要基于connector组件,所谓监听的套接字的程序,能够接手用户的请求,被称为连接器 一个server内部可以完全运行N个引擎,无非就是运行多个虚拟机而已 war包的概念 放在网页目录可以直接访问,而部署的时候可以自

Servlet基础知识详解

Servlet基础知识详解 Servlet基础知识详解 Servlet程序执行全过程 Servlet映射路径 Servlet映射练习 Servlet生命周期 为什么要学习Servlet生命周期 Servlet重要的生命周期方法 模拟通过反射构造Servlet对象 Servlet单实例多线程 Servlet留给开发者的init方法 Servlet中核心对象学习 HttpServletRequest对象 HttpServletResponse对象 ServletConfig对象 ServletCon

I2C 基础原理详解

今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都是用I2C通信方式进行通信的. I2C(Inter-Intergrated Circuit)通信使用Clock Line(SCL:Serial Clock)和Data Line(SDA:Serial Data).数据通过时钟同步经过数据线进行传输.这里生成时钟信号并输出的设备便是Master, 时钟