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指针相关推荐

  1. cpp中sizeof与指针

    一直不清楚c++的sizeof,现在通过实验得到了一些了解. 1 #include<iostream> 2 3 using namespace std; 4 5 class A{ 6 pr ...

  2. C++中的this指针

    1.Cpp中的this指针 在C++中,每一个对象都能通过this指针来访问自己的地址.this指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象.友元函数没有this指针,因 ...

  3. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 二./bin/dexopt 源码分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ...

  4. c++ 智能指针_详解 C++ 11 中的智能指针

    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...

  5. Cpp中string使用

    Cpp中string的使用 1. 创建和初始化 2. 操作符 3. string和char*的区别 4. 相关操作 4.1 append 添加文本 4.2 assign赋值 4.3 at 4.4 be ...

  6. QT中的D指针与Q指针

    了解QT中引入D指针的初衷前需要了解下二进制兼容 1. 什么是二进制兼容 二进制兼容是针对动态链接库而言的,如果你的源代码已经编译成为可执行文件了,其中你调用了一些动态库,后来你为这个动态库进行了更新 ...

  7. 在析构函数中delete this指针问题

    思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...

  8. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  9. 简单介绍C++中常量与指针

    在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的,所以这篇文章主要给大家介绍了关于C++中常量与指针的相关资料,需要的 ...

最新文章

  1. LeetCode Summary Ranges(简单的数组处理)
  2. 数据结构与算法笔记(六)—— 冒泡排序
  3. 基于 Blazor 开发五子棋小游戏
  4. intellij 快捷键_IntelliJ中的键盘快捷键
  5. [转]XHTML+CSS兼容性解决方案小集
  6. 游戏与计算机系统不兼容,电脑安装游戏时提示此文件版本与正在运行Windows不兼容的解决方法...
  7. ssh开发所需要的架包
  8. 2020年华工计算机应用基础随堂作业,《计算机应用基础》随堂练习-2020年华工网络教育.docx...
  9. Git只获取部分目录的内容
  10. boostrap框架学习
  11. windows内核和Linux内核区别
  12. ApacheCN 翻译活动进度公告 2019.6.15
  13. 图中最深的根 (25分)
  14. Vue3+Naive踩坑
  15. 探索式测试--第八章(软件测试的未来)--读书笔记
  16. 图片文字翻译的软件有哪些?快收藏这几款实用的软件
  17. Oracle归档日志使用情况及自动清理
  18. 闭关修炼——five——Spring
  19. OSChina 周三乱弹 —— 同志,你这个书签掉毛严重啊
  20. 比较两篇文章的相似性方法

热门文章

  1. sql 合并相同条件的字段
  2. TFS2010迁移后Web工作项访问提示:error HRESULT E_FAIL has been returned from a call to a COM component....
  3. Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交
  4. 【数据结构与算法】之深入解析“二叉树的前序遍历”的求解思路与算法示例
  5. RxSwift之深入解析特殊序列deallocating与deallocated的源码实现
  6. 2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人
  7. 十六进制的几种输出方式
  8. 【Linux】一步一步学Linux——curl命令(193)
  9. 【Linux】一步一步学Linux——systemctl命令(147)
  10. 【Linux系统编程】线程堆栈大小的使用介绍