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

相关推荐
被摘下的星星4 分钟前
Java 中 .length、.length() 以及 .size() 的区分
java·开发语言
代码不停9 分钟前
子数组问题
java·算法
geovindu16 分钟前
CSharp: State Pattern
开发语言·后端·c#·.net·状态模式·行为模式
小欣加油17 分钟前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
IT小白杨21 分钟前
TikTok小店防封号浏览器实战:2026年多店铺环境隔离与账号安全运营技术解析
开发语言·数据库·安全·php·chrome devtools·指纹浏览器
Patrick在香港21 分钟前
Python 拉取 C&SD 官方 API:香港 2022 年已跨过“超老龄线“,而抚养比正在爬回 1961
android·c语言·python·数据分析·时序数据库·数据可视化·香港
信誓旦旦的程序猿24 分钟前
【零依赖量化数据实战 #25】北交所技术指标与基本面
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
2601_9669496526 分钟前
Python 量化开发为什么适合使用金融数据 SDK?从数据获取到策略研究的工程化实践
开发语言·python·数据分析·量化交易·股票数据·quantdash
万年咸鱼28 分钟前
Java ArrayList 详解:原理、用法与实战
java·开发语言·windows
长友cy32 分钟前
Qt官方示例Application源码阅读
开发语言·qt