【C++】this指针的理解和__thiscall的调用方式

2023-11-06

我们可以从以下三方面来认识this指针:

一.为什么会产生this指针??

二.this指针的特点。

三.__thiscall的调用方式

四.问题

 

一。为什么会产生this指针???

class Box
{
public:
	int volume(int height, int width, int length)
	{

		return height*width*length;
	}

private:

};

int main()
{
	Box t1, t2, t3;
	t1.volume(2, 4, 5);
	t2.volume(3, 6, 9);
	t3.volume(7, 8, 9);

	system("pause");
	return 0;

}

我们可以从上边代码看出,定义了三个对象t1,t2,t3再调用时他们是如何区分自身的height,width,length这时候就需要他们各自的this指针来完成。在调用时系统会把对象t1的起始地址赋给this指针,于是在成员函数引用数据成员时,就按照this的指向找到各自对应的数据成员。(这里可以从反汇编中更好的理解)

从反汇编理解this指针:https://blog.csdn.net/jxz_dz/article/details/47808795

 

由此,我们得出结论 : 将全局的函数放进结构体内,便出现了this指针,该this指针是由ecx传递的 . 更重要的是这是编译器替我们加上的.

即是说,由C转化为C++,更多的是编译器做的操作.

可以归纳this指针的本质 :

 this是调用结构体(或类)内部成员函数时传递的参数(通常用ecx传递) . 其本质是结构体变量(或者对象)的第一个成员变量的地址.

二.this指针的特征

  • this指针的类型:类类型*const
  • this指针的地址寄存在ecx中
  • this指针并不是对象本身的一部分,不影响sizeof的结果
  • this的作用域在类“成员函数”的内部
  • this指针是类“成员函数”的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递
  • 只有在类的非静态成员函数中才可以使用this指针,其他任何函数都不允许
  • this指针不可以++ - -操作 , 即this指针的值不可以被改变 .
  • .参数个数确定的函数,this指针是由ecx传递的 , 在变参函数中最后一个传递的参数是this指针

三.__thiscall的调用方式

class Box
{
public:
	int volume(int height, int width, int length)
	{

		return height*width*length;
	}


private:

};

int volume(int height, int width, int length)
{

	return height*width*length;
}

int main()
{
	Box t1, t2;
	t1.volume(2, 4, 5);
	t2.volume(3, 6, 9);
	


	volume(1, 2, 3);
	system("pause");
	return 0;

}

从上边的代码和反汇编我们可以看出__thiscall的调用特点

  • 参数的传递顺序:从右向左
  • 参数的传递方式:是利用栈传递
  • 堆栈平衡:调用者平衡堆栈(外平栈)
  • __thiscall只能够用在类的成员函数上
  • 如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入栈堆
  • 对参数个数不确定的,调用者清理堆栈,否则函数自己清理堆栈

.问题

1.引用底层的是指针,此处为什么不是引用,而是this指针???

     因为this指针出现的时间比引用早所以用this指针

2.this指针可以为空吗??

#include<iostream>
#include<Windows.h>
using namespace std;

class MyClass
{
public:

	void show()
	{

		//this指向的就是该函数的地址(正在调用时的成员函数所在对象的起始地址)(寄存在ecx中)
		cout << this << endl;

	}
private:

};


int main()
{

    
	//this指针也可以为空

	MyClass* t = NULL;
	t->show();

	system("pause");
	return 0;
}

从上边代码以及运行的结果可以知道:this指针可以为空!!! 

 

this指针关于delete的问题:

参考:https://blog.csdn.net/shltsh/article/details/45949755

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】this指针的理解和__thiscall的调用方式 的相关文章

  • 爬虫豆瓣top250

    爬虫豆瓣top250 前言 一 爬虫是什么 二 爬取豆瓣的原因 三 爬虫项目步骤 1 准备工具 2 学习python的相关知识 3 爬虫过程讲析 四 成果展示 五 代码展示 前言 随着网络的迅速发展 万维网成为大量信息的载体 如何有效地提取
  • 深度学习理论_卷积神经网络

    1 要点 激活函数一般用于卷积层和全连接层之后 激活函数是深度网络非线性的主要来源 常见的激活函数Sigmoid 双曲正切 ReLU 生物启发 克服了梯度消失问题 PReLU alpha可学习 ELU和maxout 其中PReLU和ELU都
  • MQClientException: CODE: 208  DESC: query message by key finished, but no message.

    2019 05 15 10 19 31 401 INFO closeChannel close the connection to remote address 127 0 0 1 10911 result true 2019 05 15
  • lua的for循环

    lua的三种for循环介绍 本文的lua代码编辑于luaforwindows 1 数值for循环 如图 举例如下 2 ipairs迭代器 举例如下 说明 ipairs按照索引值顺序 打印出了table中有索引值的数据 没有索引值的不管 3
  • 自定义mvc原理和框架实现

    目录 1 什么是MVC 2 自定义MVC工作原理图 3 自定义mvc的简单实现 1 中央控制器 2 Action接口定义 3 实现子控制器 4 完善中央控制器 1 请求分发功能 2 使用配置文件配置action 3 请求参数处理 4 完善A
  • vector中emplace_back和push_back详解,源码解读

    C 11之前 通常使用push back 向容器中加入一个右值元素 临时对象 的时候 首先会调用构造函数构造这个临时对象 然后需要调用拷贝构造函数将这个临时对象放入容器中 原来的临时变量释放 这样造成的问题是临时变量申请的资源就浪费 C 1
  • 关系型数据库与非关系型数据库Nosql区别汇总

    目录 关系型数据库与非关系型数据库详细比较 关系型数据库与非关系型数据库优缺点对比 关于Nosql 1 Nosql 2 Nosql特点 3 Nosql主要主流产品 4 Nosql数据库四大分类 关系型数据库与非关系型数据库详细比较 1 关系
  • MATLAB 在向量后面加一个元素

    1 向量后面加元素 gt gt x 1 2 3 4 5 gt gt y 6 gt gt x x y x 1 2 3 4 5 62 构建矩阵
  • OpenLayers的点击事件

    OpenLayers的点击事件是附加在整个ol Map对象上的 var selectSingleClick new ol interaction Select map addInteraction selectSingleClick sel
  • JavaWeb技术之多表操作

    目录 1 多表关系 2 多表操作之一对多 2 1 数据表 2 2 创建实体类 2 3 建立两表之间的属性关系 2 4 创建Dao层接口代码和实现类 操作数据库 2 5 测试类 3 多表操作之多对一 3 1 在上一步的基础上 完成多对一 3
  • GNU MCU Eclipse (STM32调试) win7配置

    eclipse官方有开源项目对STM32开发支持较好 由于Eclipse更新较快 插件配置较麻烦 建议使用开源项目 打包下载后直接使用 前提是已安装好JDK 安装好的界面如下 ST LINK配置好调试界面如下 测试工程结构如下 设备安装包如
  • C++程序习题-将字符串按逆序输出[1.15]

    输入一个字符串 把其中的字符按逆序输出 如输入LIGHT 输出为THGIL 要求用string方法 include
  • 网站顶部添加滚动文字

    如果我们在自己网站上添加一段滚动的文字会显得更高级一些 下面就看我如何实现的吧 实现效果 具体看本站 实现代码 精心整理 1 来回滚动
  • 利用 SOAR 加快事件响应并加强网络安全

    随着攻击面的扩大和攻击变得越来越复杂 与网络攻击者的斗争重担落在了安全运营中心 SOC 身上 SOC 可以通过利用安全编排 自动化和响应 SOAR 平台来加强组织的安全态势 这一系列兼容的以安全为中心的软件可加快事件调查和响应速度 SOAR
  • 股指期货日内平仓手续费高,锁仓可以解决吗

    对于平今加收的品种 以股指为例 如何解决日内手续费过高的问题 解决方案如下 逻辑讲解 现阶段股指手续费 张三交易IF合约 如果是日内开仓 日内平仓的话 根据交易所的交易规则 则张三开仓扣除25元手续费 日内平仓的还需扣除378元手续费 总计
  • [计算机组成原理] 以低字节地址为字地址

    以低字节地址为字地址 就是小端存储模式 数据低位 或者说低字节 存储在内存低地址 以高字节地址为字地址 就是大端存储模式 数据低位 或者说高字节 存储在内存高地址 现在看一个例题 这个题目有一个需要明确的地方 什么是第一 第二 第三字节 对
  • WPF 实现多语言

    1 编写Chinese xml English xml文件 2 在项目的App xml文件中
  • laravel —— 神奇的服务容器

    容器 字面上理解就是装东西的东西 常见的变量 对象属性等都可以算是容器 一个容器能够装什么 全部取决于你对该容器的定义 当然 有这样一种容器 它存放的不是文本 数值 而是对象 对象的描述 类 接口 或者是提供对象的回调 通过这种容器 我们得
  • qt相关的demo集合

    自己写过的qt c 相关程序的demo集合 许多学习自网络中 很感谢大家的分享 源码地址 Qt与学习通页面 记录与Qt相关的代码 Gitee com 源码目录 echart简单应用 opencv图像处理 QSetting简单使用 QtAv播
  • 运维思考:Java进程管理规范

    需求 无论是在spring boot 还是spring cloud 项目中 随着应用的不断增多 JVM参数的统一管理的重要性就会凸显出来 否则你可能会遇到几个问题 Java进程出现性能问题 无GC日志支撑提供重要信息 OOM异常频发 无法通

随机推荐

  • JDK下载 JVM调优工具jvisualvm下载

    一 JDK JDK官网地址 二 visualvm visualvm官网 JDK8以及之前自带有有visualvm插件 JDK9以及之后就不自带 1 下载安装 官网下载解压后 在解压目录 etc visualvm conf设置JDK所在路径
  • 收藏

    点上方计算机视觉联盟获取更多干货 仅作学术分享 不代表本公众号立场 侵权联系删除 转载于 作者丨叶润源 来源丨https www yuque com yerunyuan ar9831 tsm0id Kfi4w 编辑丨极市平台 985人工智能
  • 【满分】【华为OD机试真题2023 JS】字符串解密

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 字符串解密 知识点数组字符串排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定两个字符串string1和string2 string1是一个被加扰的字符串
  • 龙龙送外卖PTA

    龙龙是 饱了呀 外卖软件的注册骑手 负责送帕特小区的外卖 帕特小区的构造非常特别 都是双向道路且没有构成环 你可以简单地认为小区的路构成了一棵树 根结点是外卖站 树上的结点就是要送餐的地址 每到中午 12 点 帕特小区就进入了点餐高峰 一开
  • 每日一题:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    每日一题 给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 2020年11月20日 力扣 简单 最大子序和 一 题目描述 给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少
  • 云数据中心备份容灾设计方案

    导读 云计算中心 涵盖系统多 类型复杂 关键性程度不一 因此对于恢复目标也有不同的要求 针对不同恢复目标的业务采取不同的灾备技术 同时考虑到数据中心重要性 需要建立同城灾备数据中心 并规划异地灾备中心 实现两地三中心 云数据中心备份容灾设计
  • 云服务器怎么设置数据库文件,服务器上数据库文件共享设置

    服务器上数据库文件共享设置 内容精选 换一换 本章节适用于MRS 3 x之前版本 Loader支持以下多种连接 每种连接的配置介绍可根据本章节内容了解 obs connectorgeneric jdbc connectorftp conne
  • 【2023】华为OD机试真题Java-题目0202-去除多余空格

    去除多余空格 题目描述 去除文本多余空格 但不去除配对单引号之间的多余空格 给出关键词的起始和结束下标 去除多余空格后刷新关键词的起始和结束下标 条件约束 不考虑关键词起始和结束位置为空格的场景 单词的的开始和结束下标保证涵盖一个完整的单词
  • 计算机无法访问外部网络怎么解决方案,局域网无法访问另一台计算机的解决方案...

    从网络邻居中打开工作组时显示 MSHOME 无法访问 您可能没有权限使用网络资源 请与这台服务器的管理员联系以查明您是否有访问权限 此工作组的服务器列表当前无法使用 可以PING通另一台 另一台可以访问这台 服务设置也差不多 本地安全策略来
  • 数据结构与算法C++实现(10)之哈希表

    一 概念 散列技术是在记录的存储位置和他的关键字之间建立一个确定的对应关系f 是的每个关键字key对应一个存储位置f key 查找时 根据这个对应的关系找到给定值key的映射f key 若查找集合中存在这个记录 则必定在f key 的位置上
  • IHO s-57(ENC)

    IHO S 57 ENC 目前 IHO S 57支持读访问 S 57驱动模型中 S 57数据支持所有的S 57特征数据 S 57对象被翻译成专题数据 S 57几何对象被自动收集 被翻译成几何特征 s 57 Reader依靠两个支持文件 s5
  • Edge浏览器以图搜图插件Search by Image安装与使用

    1 安装插件 2 以图搜图 右键 gt Search by Image gt Yandex 3 成功搜图 4 如果Yandex打不开 看这个文章 Windows系统无法访问 yandex com 解决方案
  • springboot调整请求头大小_解决Springboot get请求是参数过长的情况

    问题原因 Springboot get请求是参数过长抛出异常 Request header is too large 的问题 错误描述 java lang IllegalArgumentException Request header is
  • python3.8+pytorch 1.7.0+cuda10.2+cuDNN

    本文是在电脑中直接安装cuda10 2的过程 如果是要在anaconda环境中安装的话 可以直接只在虚拟环境中使用命令进行安装 用以下链接中的过程即可 在anaconda虚拟环境中安装pytorch和cuda教程 安装过程中看到的不错的教程
  • CVE-2022-30190复现及原理

    今天各厂商都在发布CVE 2022 30190的安全通告 作为一个与Office有关的RCE漏洞 其原理并不复杂 但利用非常简单无脑甚至不用点击 以后钓鱼肯定要经常用 这里简单复现分析下 环境 Win10 0 16299 32位 Micro
  • OLED透明屏原彩优势和特点解析:开创显示技术新时代

    OLED透明屏 原彩作为一项领先的显示技术 正以其卓越的性能和创新的设计特点引起广泛关注 本文将通过深入探讨OLED透明屏 原彩的优势和特点 应用领域 技术发展以及未来前景等方面内容 并结合具体数据 报告和行业动态 为读者提供专业可信的信息
  • java设置httpheaders_HttpClient 请求添加Header头部信息

    HTTP消息可以包含许多描述消息属性的标头 例如内容长度 内容类型 授权等 HttpClient提供了检索 添加 删除和枚举标头的方法 在下面的教程中 我们将演示如何将自定义HTTP头添加到HttpClient和Http请求方法 Maven
  • 蓬莱小课:统计学中18种数据分析方法汇总

    Part1描述统计 描述统计是通过图表或数学方法 对数据资料进行整理 分析 并对数据的分布状态 数字特征和随机变量之间关系进行估计和描述的方法 描述统计分为集中趋势分析和离中趋势分析和相关分析三大部分 集中趋势分析 集中趋势分析主要靠平均数
  • 【Pytorch】第 5 章 :解决多臂老虎机问题

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 【C++】this指针的理解和__thiscall的调用方式

    我们可以从以下三方面来认识this指针 一 为什么会产生this指针 二 this指针的特点 三 thiscall的调用方式 四 问题 一 为什么会产生this指针 class Box public int volume int heigh