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

相关推荐
一叶飘零_sweeeet13 小时前
深入拆解 Java CAS:从底层原理到 ABA 问题实战
java·cas·并发编程
StackNoOverflow13 小时前
Spring Security权限控制框架详解
java·数据库·sql
yaaakaaang13 小时前
九、装饰器模式
java·装饰器模式
weixin_5134499613 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
d_dreamer13 小时前
SeaTunnel推荐Maven版本
java·maven
飞Link13 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦14 小时前
Python3 文件 (夹) 操作备忘录
开发语言·python
清心歌14 小时前
记一次系统环境变量更改后在IDEA中无法读取新值的排查过程
java·后端·intellij-idea·idea
大尚来也14 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法
dong__csdn14 小时前
jdk添加信任证书
java·开发语言