
CPP中的this指针
发布日期:2021-05-07 00:51:08
浏览次数:25
分类:精选文章
本文共 1337 字,大约阅读时间需要 4 分钟。
this指针是类的一个自动生成、自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象。
全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。class Ctest
{ public: void Funtest(int iValue) { _iValue = iValue; } void Print() { cout << _iValue << endl; } private: int _iValue;//调用私有变量只能用公有成员接收,成员变量在类中具有全局作用域 };int main()
{ Ctest test; test.Funtest(30); test.Print(); system("pause\n"); return 0; }
我们来观察对Funtest函数的调用,test.Funtest(),在这里,我们运用了点运算符来访问test对象的Funtest成员,然后调用它。
当我们调用某个成员函数时,实际上是在替某个对象调用它。如果Funtest指向Ctest的成员(例如iValue),则它隐式地指向调用该函数的对象的成员。
成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。当我们调用那个函数时,用请求该函数的对象地址初始化this.例如:如果调用
test.Funtest(),则编译器负责把test的地址传递给Funtest的隐式形参this。可以等价的认为编译器将该调用重写成了如下形式://此处只用于说明调用成员函数实际执行过程
Ctest::Funtest(&test)1
2我们可在反汇编中查看调用过程
在成员函数内部,我们可以直接使用调用该函数的成员,而无需通过成员访问运算符来做到,因为this指针所指的正是这个对象。任何对类成员的直接访问都 被看做是this指针的隐式引用,上面的程序可认为是this->iValue. this形参是隐式定义的,实际上,任何自定义名为this的参数或变量的行为都是非法的.所以,Funtest函数的定义相当于是void Funtest(Ctest *const this,int *iVlue)
{ this->_iValue = iValue; }1
2 3 4this是一个常量指针,不允许改变this中保存的地址
this指针的两种传参方式:
1.参数压栈:当成员函数的参数可变时,遵循_cdecl调用约定 2.ecx寄存器:当成员函数的参数固定时,这时遵循_thiscall调用约定。当this指针为NULL时编译器可编译通过
class Ctest
{ public: void Funtest() {} } int main() { Ctest *p = NULL; p->Funtest(); } ———————————————— 版权声明:本文为CSDN博主「ChaseRaod」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ChaseRaod/article/details/61617777发表评论
最新留言
很好
[***.229.124.182]2025年04月15日 04时24分42秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Redis 集合统计(HyperLogLog)
2021-05-09
RE套路 - 关于pyinstaller打包文件的复原
2021-05-09
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2021-05-09
Ef+T4模板实现代码快速生成器
2021-05-09
dll详解
2021-05-09
c++ static笔记
2021-05-09
C++中头文件相互包含与前置声明
2021-05-09
JQuery选择器
2021-05-09
MVC中在一个视图中,怎么加载另外一个视图?
2021-05-09
SQL--存储过程
2021-05-09
MVC学习系列5--Layout布局页和RenderSection的使用
2021-05-09
MVC学习系列13--验证系列之Remote Validation
2021-05-09
多线程之volatile关键字
2021-05-09
2.1.4奇偶校验码
2021-05-09
2.2.2原码补码移码的作用
2021-05-09
多线程之Lock显示锁
2021-05-09
ForkJoinPool线程池
2021-05-09
【Struts】配置Struts所需类库详细解析
2021-05-09
Java面试题:Servlet是线程安全的吗?
2021-05-09
DUBBO高级配置:多注册中心配置
2021-05-09