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

相关推荐
幻境如梦丶皆为虚10 分钟前
从零写一个 DSH 插件:在左侧菜单栏加一个「测试」
开发语言·javascript·ecmascript
吹什么轩12 分钟前
constexpr 完全指南:从 const 的两种含义,到编译期计算的四次演进
java·前端·javascript
她的男孩23 分钟前
租户 A 的验证码,却用了租户 B 的 AccessKey:Forge Admin 修跨租户短信串发
java·spring boot·saas
LabVIEW开发24 分钟前
LabVIEW 局部变量与数据流:这道 CLAD 题为什么答案是 Undefined
java·开发语言·labview
文丑颜不良啊25 分钟前
LeetCode1721~1740题目解析
java·leetcode
路溪非溪27 分钟前
C++标准库之智能指针
linux·开发语言·c++
wangbing112529 分钟前
监控网页项目常用英文缩写
java
Lxx_Zw30 分钟前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·stm32·单片机·嵌入式硬件
麻瓜code34 分钟前
双写一致性:为什么是“删缓存“,而不是“改缓存“
java·缓存·mybatis
小蒜学长37 分钟前
基于SpringBoot+Vue的云南地区扶贫助农系统的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·乡村振兴