【C++】类和对象--this指针详解

目录

如果我们问:"同一个类的两个对象,调用同一个成员函数,函数如何区分该操作谁的数据?" C++的答案是**this指针**。本文将从引入动机到底层实现,系统性地剖析这个核心机制。

this指针的引入

考虑一个日期类:

cpp 复制代码
class Date {
public:
    void Init(int year, int month, int day) {
        _year = year; _month = month; _day = day;
    }
    void Print() {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year, _month, _day;
};

int main() {
    Date d1, d2;
    d1.Init(2022, 1, 11);
    d2.Init(2022, 1, 12);
    d1.Print();
    d2.Print();
    return 0;
}

调用d1.Init(...)时,编译器必须在Init内部将_year等变量绑定到d1的数据。这个绑定机制就是:每个非静态成员函数都隐含了一个形参------指向当前对象的指针,编译器将其命名为this

对于上述Print函数,编译器视角的修饰如下:

cpp 复制代码
void Print(Date* const this) {
    cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
}

对象调用成员函数时,编译器自动将对象的地址作为实参传入:

cpp 复制代码
d1.Print();   // 被转换为 Print(&d1);
d2.Print();   // 被转换为 Print(&d2);

this指针的特性

  1. 类型:类类型* const,也就是说,this是一个指针常量,其指向不可更改,不能给它赋值。
  2. 使用范围:仅在非静态成员函数内部有效,静态成员函数没有this指针。
  3. 本质:成员函数的第一个隐含形参。调用时由编译器自动传递,用户代码中不能显式写出这个形参。但函数内部可以显式使用this,比如this->_year(虽然大部分情况省略)。
  4. 存储位置:this作为函数形参,通常存储在栈或通过寄存器(如x86-32的ecx,x86-64的rdi)传递,具体取决于编译器。对象本身并不存储this指针。
  5. const修饰:若成员函数被const修饰(void Print() const),则this类型变为const 类类型* const,表示不能通过该指针修改对象成员。

隐式传递与显式使用示例

cpp 复制代码
class Date {
public:
    Date(int year, int month, int day) {
        _year = year;
        _month = month;
        _day = day;
    }
    // 隐式 this:void Print(Date* const this)
    void Print() {
        // 可显式使用 this
        cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

需要注意的是,虽然我们可以显式写出this->,但多数风格指南建议在访问成员时省略,除非存在局部变量名与成员变量名冲突的情况(如构造函数中参数与成员同名)。

this指针是C++实现对象模型的核心支柱,它贯穿于所有非静态成员函数的调用。掌握它,才能彻底理解构造函数、析构函数、运算符重载等后续知识。接下来,我们正式进入类的六大默认成员函数之旅。

相关推荐
benbenAItalk几秒前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl6 分钟前
Java学习二 基本语法2, 算术运算符
java·学习
2601_9669496514 分钟前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin19 分钟前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_9628857220 分钟前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
anew___22 分钟前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
滕州市燕猫虎计算机科技工作室个体工商户28 分钟前
Java锁
java·开发语言
多加点辣也没关系1 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2331 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21031 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文