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寄存器传递的。

相关推荐
小bo波3 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯4 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
apocelipes6 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
SamDeepThinking15 小时前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好16 小时前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng17 小时前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking17 小时前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
Flittly1 天前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了1 天前
Java 生成二维码解决方案
java·后端
人活一口气2 天前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot