关于this指针

宏和this指针 宏,是一种批量处理的称谓。计算机科学中,代表根据一系列预定义的规则替换一定的文本模式。宏起源于汇编语言macro替换。宏用于预处理,在编译之前,sizeof是编译期计算,它是在预处理之后,所以不能将sizeof放到预处理指令中判断。 阅读详情

                                

 

初学者对this指针真的是很好奇,因为它很神秘。

其实,只要以平常心来看待,this就很平常了。
1. this只能在成员函数中使用。
全局函数,静态函数都不能使用this。
实际上,成员函数默认第一个参数为T* const register this。
如:
class A{public: int func(int p){}};
其中,func的原型在编译器看来应该是: int func(A* const register this, int p);

2. 由此可见,this在成员函数的开始前构造的,在成员的结束后清除。
这个生命周期同任一个函数的参数是一样的,没有任何区别。
当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:
A a;
a.func(10);
此处,编译器将会编译成: A::func(&a, 10);
嗯,看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会对this指针做一些优化的,因此,this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数。

3. 回答
#1:this指针是什么时候创建的?
this在成员函数的开始执行前构造的,在成员的执行结束后清除。
#2:this指针存放在何处? 堆,栈,全局变量,还是其他?
this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。
#3:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?
this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
#4:this指针如何访问类中变量的/?
如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了。
在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public。
this是类的指针,如果换成结构,那this就是结构的指针了。

#5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗?
this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
#6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?
普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。
但是,既使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数。

# 7:这些编译器如何做到的?8:能否模拟实现?
知道原理后,这两个问题就很容易理解了。
其实,模拟实现this的调用,在很多场合下,很多人都做过。
例如,系统回调函数。系统回调函数有很多,如定时,线程啊什么的。

举一个线程的例子:
class A{
int n;
public:
static void run(void* pThis){
A* this_ = (A*)pThis;
this_->process();
}
void process(){}
};

main(){
A a;
_beginthread( A::run, 0, &a );
}

这里就是定义一个静态函数来模拟成员函数。

也有许多C语言写的程序,模拟了类的实现。如freetype库等等。
其实,有用过C语言的人,大多都模拟过。只是当时没有明确的概念罢了。
如:
typedef struct student{
int age;
int no;
int scores;
}Student;
void initStudent(Student* pstudent);
void addScore(Student* pstudent, int score);
...
如果你把 pstudent改成this,那就一样了。

它相当于:
class Student{
public:
int age; int no; int scores;
void initStudent();
void addScore(int score);
}

const常量可以有物理存放的空间,因此是可以取地址的


///this指针是在创建对象前创建.
this指针放在栈上,在编译时刻已经确定.
并且当一个对象创建后,并且运行整个程序运行期间只有一个this指针.

本篇文章转载

 
this指针和delete this 文章目录this指针的作用this指针是否可以为空delete this合法吗 this指针的作用   this指针是指向类对象的指针,在类的成员函数中通过this指针这个隐式参数来访问调用它的对象。当我们调用一个成员函数时,编译器会把对象的地址传给成员函数的隐式形参this。this指针可以区分静态成员函数和外部函数(如静态函数),后者没有。   为什么要引入this指针。由于每个对象都有其状态... 阅读详情

相关推荐

【C++】4-1.11 class类的数据成员与this指针

【【C++】4-1.11 class类的数据成员与this指针1.数据成员的作用域2.数据成员被同名屏蔽3.this 指针 1.数据成员的作用域 1.1、数据成员可以被class类内所有的函数访问, 即数据成员对于成员函数,相当于全局变量; 1.2、数据域与成员函数可按任意顺序声明; 如下示例1,2,3的声明方式效果一致: 声明方式,示例1 class Square { public: Square(); Square(double); double getArea(); double getSid

jn10010537的博客 649

c++中class 中的this指针

1.this指针的经典描述: 当你进入一个房子后,    你可以看见桌子、椅子、地板等,    但是房子你是看不到全貌了。    对于一个类的实例来说,    你可以看到它的成员函数、成员变量,    但是实例本身呢?    this是一个指针,它时时刻刻指向你这个实例本身 2.this指针的使用: 一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 retu

菜鸟成长记 2260

C++中类成员函数的this参数

在C++中,如果某个类的成员函数中使用了该类的成员(成员变量或成员函数),则该成员函数会通过一个名为this的隐式参数来访问这个成员(成员变量或成员函数)。 例如,有一个类 classmyClass() { public: intm_i; intgetI() { returnm_i; } } 其中,成员函数getI()中使用了该类的成员变量m_i,因此getI()函数实际上包含了一个隐藏的参数this, int getI(this){ return this-...

hou09tian的博客 3002

【C++】类与对象 第一篇(class,this)

在C++中,类(Class)是一种用户自定义的数据类型,用于封装数据和方法。它是面向对象程序设计的基本概念之一,通过将相关的数据和方法捆绑在一起,可以更加清晰和灵活地组织代码。类可以看作是一个模板或者蓝图,用于创建对象(Object)。类定义了对象的属性(成员变量)和行为(成员函数)。成员变量是类的数据成员,用于存储对象的状态;成员函数是类的成员操作,用于操作和访问对象的状态。通过使用类,能够将数据和操作封装在一起,实现了数据的隐藏和封装,提供了更好的代码重用性和可维护性。

2301_77649794的博客 511

Origin 2025b中文版安装全指南:避开乱码、水印与崩溃陷阱

Origin作为科研绘图领域的事实标准,其2025b版本首次官方支持简体中文UI,但安装远非‘下一步’即可完成。核心在于理解软件本体、语言包、许可证服务与系统区域设置四者间的耦合关系——尤其Windows非Unicode程序语言必须设为‘中文(简体,中国)’,否则必然触发坐标轴乱码、PDF文字方块等典型故障;而AI辅助拟合、内置Python 3.11等新特性,又依赖正确的字体链(如SimSun)与注册表强制加载(UILanguage=zh-CN)才能稳定启用。该版本广泛应用于材料科学、电化学、XRD/SEM

weixin_42548874的博客 1393

2025海外代理IP深度横评:Bright Data、IPFoxy、SmartProxy等六大服务商实战对比

本文深度横评2025年六大海外代理IP服务商(Bright Data、IPFoxy、SmartProxy、IPIPGO、Kookeey及青果网络),基于实战测试数据,从IP池质量、速度稳定性、性价比等维度进行对比。针对跨境电商、数据爬虫、社交媒体管理等不同业务场景,提供精准的选购指南与避坑建议,帮助企业用户根据自身需求选择最合适的代理IP解决方案。

weixin_29196891的博客 434

C++基础#4:this指针的用法-何时显示引用与隐式引用

this指针的含义及其用法:1. this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 4. 在C++中,thi

记录和分享程序人生的点点滴滴 6230

保姆级教程:用Intouch SMC连接S7-200 Smart PLC,Modbus TCP和S7协议一次搞定

本文详细介绍了如何使用Intouch SMC连接S7-200 Smart PLC,涵盖Modbus TCP和S7协议的双协议通信配置。通过环境准备、参数设置、常见问题排查及实战技巧,帮助工程师快速实现工业自动化系统中的稳定通信,提升设备监控效率。

weixin_30499315的博客 429

【C++ | this指针】一文了解C++的this指针

👉本文介绍了C++的this指针,为什么需要this指针,什么是this指针,怎么使用this指针。

wkd_007的博客 1890

超详细!DeepSeek本地搭建部署、搭建知识库及智能体教程

通过以上详细的步骤,我们完成了DeepSeek的本地搭建部署、知识库的搭建以及智能体的创建。这一过程不仅让我们深入了解了大模型的应用,还为我们开发个性化的智能应用奠定了基础。在实际应用中,可以根据具体需求进一步优化模型、知识库和智能体的性能和功能。希望本文能帮助大家快速上手DeepSeek相关技术,开启属于自己的人工智能创新之旅。

Ljugg的博客 8177

C#实战:如何用TSCLIB.dll实现TSC打印机的状态监控与异常处理(附完整代码)

本文详细介绍了如何利用C#和TSCLIB.dll构建企业级TSC打印机状态监控与智能异常处理系统。通过解析十六进制状态码、设计高可靠性的轮询引擎以及实现事件驱动的报警机制,开发者可以打造一个稳定、可观测的打印服务,有效保障物流仓储、生产制造等高频打印场景的业务连续性。

weixin_29227585的博客 64

this指针

this是一个指针,它时时刻刻指向你这个实例本身。你可以看到它的成员函数、成员变量,this指针本质上是“成员函数”的形参。你可以看见桌子、椅子、地板等,静态成员函数中不能使用this指针。但是房子你是看不到全貌了。对于一个类的实例来说,当你进入一个房子后,不能给this指针赋值。

m0_63783532的博客 8503

openclaw通俗入门系列9——流式传输 + 分块

流式传输 = 不等写完就开始发。分块流式传输是把长回复切成几条消息发(所有渠道),草稿流式传输是像打字一样实时显示(仅 Telegram)。可以配置块大小、发送时机、合并规则、类人延迟。

m0_60605453的博客 506

c++(16)this指针详解

在c++类的静态成员变量和静态成员函数中,多次涉及到了this指针。下面注重介绍一下前面讲static成员变量占用的时候提到,如果sizeof类的大小,是不会计算static成员变量的,同样的也不会计算成员函数,换句话说,其实成员函数是在类外的。那么当我们创建完对象,使用对象的成员函数,它是怎么知道我们访问的是哪个对象的成员变量的?我们知道编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数能在创建对象后通过对象来调用并访问该对象的成员变量。

tr_ainiyangyang的博客 7586

近五年体内微/纳米机器人赋能肿瘤精准治疗综述:以 GBM 为重点

摘要 微/纳米机器人在实体瘤治疗领域展现出突破性潜力,通过主动运动能力解决传统纳米药物递送效率低、渗透不足等核心问题。2021-2025年间形成三条技术路线:1) 磁驱、声驱等运动增强递送实现深层渗透;2) 与免疫治疗融合实现原位免疫唤醒;3) 针对胶质母细胞瘤开发跨屏障递送系统。研究重点从单一运动性能转向"运动-分布-疗效"的系统评价,需建立标准化指标评估运动学参数、肿瘤分布均匀性和安全性。未来挑战在于临床转化的可制造性、闭环操控及生物相容性优化,特别是对血脑屏障穿透等复杂场景的系统集

AllenLV的博客 5104

智能挂锁软件需求规格说明书(SRS)

智能挂锁系统SmartPadlockV1.0是一款融合蓝牙通信、指纹识别和远程控制技术的便携式安防设备。系统由设备端、移动App和云平台三部分组成,支持蓝牙配对(10米内)、指纹识别、OTP一次性密码等多种开锁方式,响应时间<1.5秒。产品采用SM2/SM4加密技术保障安全,日均20次使用下续航达180天,兼容iOS13+/Android8.0+系统。功能包括设备绑定、远程授权、开锁记录查询和OTA固件升级,符合个人信息保护法规要求,适用于仓储、快递柜等多场景应用。

moton2017的博客 2111

this指针_C++ 自引用指针this

作者:鲸90830链接:https://www.cnblogs.com/whale90830/p/10532844.html自引用指针this例 3.1 this指针的引例#includeclassA{public:A(intx1){x=x1;}voiddisp(){cout<<"x="<private:intx;};main(...

weixin_39571087的博客 226

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

this指针详解

什么是this指针? 当我们进入一个房子之后,可以看见房子里的电视、灯、花草等,但是看不到房子的全貌。对于一个类的实例来说, 你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个实例 具体说明: 在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配 有自己独立的存储空间。如果对同一个类定义多个对象,则有多个同样大小的空...

qq_41148509的博客 1141

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ this指针讲解

原因:这里p是空指针,传过去的this指针只是接收了p的空指针,但是在PrintA()中,会隐含一个this->_a,而this指针是一个空指针,访问this指针_a的位置,就要对this指针进行解引用,此时程序就会崩溃,因为对空指针进行了解引用。对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,从汇编代码上看:它们的调用地址都是一样的。注意:这里我们不能显示this指针所操作的写出来,因为他是隐含的,我们不能抢了编译器的活。

cja0222的博客 997

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++的this指针

C++的this指针 当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。 对于一个类的实例来说, 你可以看到它的成员函数、成员变量, 但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。 C++在初始化对象时,每个对象中的数据成员都会得到系统分配的自己独立的存储空间。对于成员函数来说,一个函数的代码段在内存中只有一份,同一个类中的不同对象在调用自己的成...

物是人非,结局始终不美 1万+

this指针_this 指针的作用

this 指针的作用它的作用是指向成员函数作用于的对象,所以非静态您可以在成员函数中直接使用它来表示指向该函数所作用的对象的指针。以下示例可以说明其作用:输出结果:2000020000接下来,我们看下面的代码,您认为输出结果是什么?会出错吗?答案是正常输出问候。您可能对p指针为空这一事实感到好奇。程序不应该崩溃吗?不用担心,我们可以先将以上代码转换为C程序,以了解其正常工作的原因。所...

weixin_39828102的博客 480

this 指针

什么是 this 指针? C++this指针,一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。 this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候, 编译器会自动将对象本身的地址作为一个隐含参数传递给函数。 this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中, 指向被调用函数所在的对象。全局仅有一个this指针...

快乐星球 1093
上一篇: directshow 学习笔记 下载包括directshow sdk的directX9 sdk的地址
下一篇: 复杂的C++声明阅读
computerart
博客等级 码龄20年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值