当前位置: 首页 > news >正文

深入浅出 C++ this 指针:从原理到实战

目录

一、开篇:为什么需要 this 指针?

二、this 指针的核心定义

三、this 指针的使用场景

场景1:解决成员变量和函数参数重名问题

场景2:返回当前对象的引用

场景3:在成员函数中访问当前对象的地址 / 比较对象

四、this 指针的常见误区(避坑指南)

误区 1:在静态成员函数中使用 this 指针

误区 2:修改 this 指针本身

五、进阶:const 成员函数中的 this 指针

六、总结


一、开篇:为什么需要 this 指针?

当你在 C++ 中定义一个类的成员函数时,函数如何知道要操作哪个对象的成员变量?比如两个Person对象p1p2,调用p1.setName("张三")时,函数怎么确定修改的是p1name,而不是p2的?答案就是this指针 —— 它是 C++ 给成员函数隐式传递的 “对象身份证”,帮函数精准定位要操作的对象。


二、this 指针的核心定义

本质this是成员函数中一个隐式的常量指针const 类名* const),指向调用该成员函数的对象本身。

特点

  1. this指针由编译器自动生成、自动传递,不需要程序员显式定义;

  2. 仅在类的非静态成员函数中可用(静态成员函数没有this,因为静态成员属于类,不属于单个对象);

  3. this指针的值就是当前对象的内存地址;

  4. this指针不能被修改(指针本身是 const),但可以修改this指向的对象的成员(除非成员函数是const修饰的)

三、this 指针的使用场景

场景1:解决成员变量和函数参数重名问题

#include <iostream> #include <string> using namespace std; class Person { private: string name; int age; public: // 构造函数:参数名和成员变量名重名,用this区分 Person(string name, int age) { // this->name 指向当前对象的成员变量name this->name = name; this->age = age; } // 成员函数:同样用this区分 void setName(string name) { this->name = name; } void showInfo() { cout << "姓名:" << this->name << ",年龄:" << this->age << endl; // 等价于 cout << "姓名:" << name << ",年龄:" << age << endl; // 编译器会自动给成员变量加上this->,只是隐式的 } }; int main() { Person p("张三", 20); p.showInfo(); // 输出:姓名:张三,年龄:20 p.setName("李四"); p.showInfo(); // 输出:姓名:李四,年龄:20 return 0; }

场景2:返回当前对象的引用

#include <iostream> using namespace std; class Calculator { private: int result; public: Calculator() : result(0) {} // 返回当前对象的引用,支持链式调用 Calculator& add(int num) { this->result += num; return *this; // 解引用this,返回当前对象本身 } Calculator& sub(int num) { this->result -= num; return *this; } int getResult() { return this->result; } }; int main() { // 链式调用:add和sub都返回对象本身,所以可以连续调用 Calculator calc; int res = calc.add(10).sub(3).add(5).getResult(); cout << "最终结果:" << res << endl; // 输出:12 return 0; }

场景3:在成员函数中访问当前对象的地址 / 比较对象

#include <iostream> using namespace std; class MyClass { public: void printThis() { // 输出this指针的值(当前对象的地址) cout << "this指针的值:" << this << endl; } bool isSameObject(MyClass& other) { // 比较两个对象的地址是否相同 return this == &other; } }; int main() { MyClass obj1, obj2; obj1.printThis(); // 输出obj1的地址 obj2.printThis(); // 输出obj2的地址(和obj1不同) cout << "obj1和obj1是否是同一个对象:" << obj1.isSameObject(obj1) << endl; // 1(true) cout << "obj1和obj2是否是同一个对象:" << obj1.isSameObject(obj2) << endl; // 0(false) return 0; }

四、this 指针的常见误区(避坑指南)

误区 1:在静态成员函数中使用this指针

class Test { public: static void func() { cout << this << endl; // 编译错误:静态成员函数没有this指针 } };
  • 原因:静态成员函数属于类本身,不属于任何对象,编译器不会为其传递this指针。

  • 解决方案:静态成员函数只能访问静态成员变量 / 函数,不能访问非静态成员(除非显式传入对象)。

误区 2:修改this指针本身

class Test { public: void func() { this = new Test(); // 编译错误:this是const指针,不能修改 } };
  • 原因:this的类型是类名* const(指针本身不可变),只能修改指向的对象的成员,不能修改指针本身。

五、进阶:const 成员函数中的 this 指针

如果成员函数被const修饰,this的类型会变成const 类名* const—— 不仅指针本身不可改,指向的对象也不可改:

#include <iostream> using namespace std; class Test { private: int num; public: Test(int num) : num(num) {} // const成员函数:this是const Test* const void show() const { cout << num << endl; // 允许:只读 // this->num = 100; // 编译错误:const成员函数不能修改成员变量 } void modify() { this->num = 100; // 允许:非const成员函数 } }; int main() { const Test t(10); t.show(); // 允许:const对象只能调用const成员函数 // t.modify(); // 编译错误:const对象不能调用非const成员函数 return 0; }

六、总结

1.this是隐式的、编译器自动传递的常量指针;

2.仅在非静态成员函数中可用,不占用对象内存;

3.const 成员函数会限制this指针的修改权限。

http://www.jsqmd.com/news/488207/

相关文章:

  • MiroFish群体智能通信框架:构建高可靠智能体协作系统的技术实践
  • 造相-Z-Image惊艳效果:发丝级细节、布料褶皱、瞳孔高光等写实要素特写
  • JWE与JWT:安全加密的核心差异
  • Qwen-Image-2512-ComfyUI场景实战:水墨风、写实风格等多种风格图片生成
  • 储能风电分布式发电一次调频仿真频率支撑 双馈风力发电机协同并网储能系统实现电网频率支撑、新能源...
  • DeepSeek-OCR-2快速体验:开箱即用的OCR神器,上传图片自动提取文字
  • 告别游戏管理混乱:itch.io桌面应用的一站式解决方案
  • 计算机去中心化:重塑数字世界的未来
  • 黑丝空姐-造相Z-Turbo持续集成:利用GitHub Actions自动化测试模型部署
  • Magma在推荐系统中的应用实践
  • 软考通关秘籍:技术要点全解析
  • 开源工具DBeaver效率提升配置指南:从基础到高级的功能扩展与性能优化
  • 欧意注册下载地址okxz.run复制进去-2026年最新版V5.6.12.5.24安卓/苹果版
  • 5分钟搞定uni-app H5项目Nginx配置(含阿里云服务器Xshell/Xftp操作详解)
  • 鸿蒙应用开发全流程指南
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4模型轻量化之美:小身材也有大智慧的对话展示
  • Qwen2.5-VL多模态应用:用Ollama快速搭建智能图片识别系统
  • S32K144 GPIO配置避坑指南:PinSetting里这些选项千万别乱设!
  • 【限时解密】微软内部未公开的MCP-Extension SDK v2.3.1性能补丁包(含源码级patch说明)
  • M-LLM视频帧选择技术解析
  • STM32+NRF24L01实战:5分钟搞定无线模块双向通讯(附避坑指南)
  • Huggingface lerobot项目在so-arm100机械臂上的复现避坑指南(附完整环境配置流程)
  • Vivado OOC模式:模块化设计高效策略
  • translategemma-27b-it效果展示:电商主图中文文案→12国语言本地化翻译作品集
  • 【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决
  • Vue3+TinyMCE6实战:手把手教你开发带目录导航的富文本编辑器(附完整代码)
  • Qwen3-0.6B-FP8在中小企业落地:2GB显存支撑多实例并发问答
  • JavaScript输出技巧大揭秘
  • 汇川AM系列PLC与CODESYS平台:手轮与EtherCAT轴协同调试实战指南
  • 3步颠覆手柄限制:shadPS4键鼠映射的精准操控革命