CPP中的this指针
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
4
this是一个常量指针,不允许改变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
CPP中的this指针相关推荐
- cpp中sizeof与指针
一直不清楚c++的sizeof,现在通过实验得到了一些了解. 1 #include<iostream> 2 3 using namespace std; 4 5 class A{ 6 pr ...
- C++中的this指针
1.Cpp中的this指针 在C++中,每一个对象都能通过this指针来访问自己的地址.this指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象.友元函数没有this指针,因 ...
- 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )
文章目录 前言 一.DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 二./bin/dexopt 源码分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ...
- c++ 智能指针_详解 C++ 11 中的智能指针
C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...
- Cpp中string使用
Cpp中string的使用 1. 创建和初始化 2. 操作符 3. string和char*的区别 4. 相关操作 4.1 append 添加文本 4.2 assign赋值 4.3 at 4.4 be ...
- QT中的D指针与Q指针
了解QT中引入D指针的初衷前需要了解下二进制兼容 1. 什么是二进制兼容 二进制兼容是针对动态链接库而言的,如果你的源代码已经编译成为可执行文件了,其中你调用了一些动态库,后来你为这个动态库进行了更新 ...
- 在析构函数中delete this指针问题
思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...
- 结构体中定义函数指针
结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...
- 简单介绍C++中常量与指针
在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的,所以这篇文章主要给大家介绍了关于C++中常量与指针的相关资料,需要的 ...
最新文章
- LeetCode Summary Ranges(简单的数组处理)
- 数据结构与算法笔记(六)—— 冒泡排序
- 基于 Blazor 开发五子棋小游戏
- intellij 快捷键_IntelliJ中的键盘快捷键
- [转]XHTML+CSS兼容性解决方案小集
- 游戏与计算机系统不兼容,电脑安装游戏时提示此文件版本与正在运行Windows不兼容的解决方法...
- ssh开发所需要的架包
- 2020年华工计算机应用基础随堂作业,《计算机应用基础》随堂练习-2020年华工网络教育.docx...
- Git只获取部分目录的内容
- boostrap框架学习
- windows内核和Linux内核区别
- ApacheCN 翻译活动进度公告 2019.6.15
- 图中最深的根 (25分)
- Vue3+Naive踩坑
- 探索式测试--第八章(软件测试的未来)--读书笔记
- 图片文字翻译的软件有哪些?快收藏这几款实用的软件
- Oracle归档日志使用情况及自动清理
- 闭关修炼——five——Spring
- OSChina 周三乱弹 —— 同志,你这个书签掉毛严重啊
- 比较两篇文章的相似性方法
热门文章
- sql 合并相同条件的字段
- TFS2010迁移后Web工作项访问提示:error HRESULT E_FAIL has been returned from a call to a COM component....
- Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交
- 【数据结构与算法】之深入解析“二叉树的前序遍历”的求解思路与算法示例
- RxSwift之深入解析特殊序列deallocating与deallocated的源码实现
- 2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人
- 十六进制的几种输出方式
- 【Linux】一步一步学Linux——curl命令(193)
- 【Linux】一步一步学Linux——systemctl命令(147)
- 【Linux系统编程】线程堆栈大小的使用介绍