C++:this指针

复制代码
class date
{
public:
    void f(int i)
    {}
}

以上是我们定义的一个简单的类,这个类里面含有一个简单的成员函数,成员函数看似只有一个参数,实际上是两个参数,除了参数i以外,还有一个指向调用该函数的对象的指针------this指针。

在实际上,编译器会把这段代码改造成这样:

复制代码
class date
{
public:
    void f(date*this,int i)
    {}
}

其他面向对象的语言也会这样做,不过可能不是指针,而是引用。

那么我们实际调用的时候是怎么样的呢?

复制代码
date i;
i.f(9);

这一段代码,在经过编译器的解释之后,就会变成这样:

复制代码
date i;
i.f(&i,9);

会把对象的地址一起传过去,这样才会方便成员函数调用对象里面的成员。

不过需要注意的是,我们在定义成员函数时,写有哪些参数的时候不能自己来写这个this指针,

复制代码
//这是错误写法
void f(date*this,...)
{
}

不过我们可以在函数内部显示地调用

复制代码
class date
{
public:
    void f(int i)
    {
        this->成员...
    }
}

不过调用对象的成员时,你自己不显式地调用,编译器会帮你补充的,所以以上的代码等于:

复制代码
class date
{
public:
    void f(int i)
    {
        成员...
    }
}

this指针严格来说是这样写的:

复制代码
class date
{
public:
    void f(date*const this,int i)
    {
        this->成员...
    }
}

这里的const修饰的是指针本身,而不是指针指向的内容。

this其实是一个关键字,this指针其实是一个形参,一般存储在栈帧里面,不过vs底下是用ecx寄存器传递的。

相关推荐
bearpping11 分钟前
Java进阶,时间与日期,包装类,正则表达式
java
IT猿手12 分钟前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
邵奈一16 分钟前
清明纪念·时光信笺——项目运行指南
java·实战·项目
AI科技星22 分钟前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
sunwenjian88636 分钟前
Java进阶——IO 流
java·开发语言·python
波特率11520042 分钟前
const关键字与函数的重载
开发语言·c++·函数重载
sinat_255487811 小时前
读者、作家 Java集合学习笔记
java·笔记·学习
FL16238631291 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
皮皮林5511 小时前
如何画出一张优秀的架构图?(老鸟必备)
java
百锦再1 小时前
Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析
java·开发语言·jvm·spring·kafka·tomcat·maven