【C++掌中宝】类和对象(二):隐藏的this指针

【C++掌中宝】类和对象(二):隐藏的this指针
在这里插入图片描述

文章目录

引言

在 C++ 编程中,类是面向对象编程的核心,而类中的成员函数与对象的交互则通过一个隐含的指针来实现,这就是 this 指针。它在 C++ 类的非静态成员函数中自动存在并指向调用该函数的对象实例。在这篇文章中,我们将详细探讨 this 指针的定义、用法以及其背后的工作原理。

1. 定义与用法

1.1 隐式存在的 this 指针

在 C++ 中,每个非静态成员函数都会隐式包含一个 this 指针,它指向调用该成员函数的对象实例。对于开发者来说,this 指针无需显式声明或传递,它由编译器自动管理。

1.2 this 指针的用途与示例

this 指针最常见的用途是解决成员变量与函数参数同名的问题,此外它还可以用于在成员函数中返回对象本身。例如:

classPerson{public:Person(int age){this->age = age;// 用 this 指针区分成员变量和参数} Person&addAge(int age){this->age += age;return*this;// 返回对象本身}int age;};

在上面的代码中,当函数的参数 age 与类的成员变量 age 同名时,我们使用 this->age 来明确表示成员变量。另外,通过 return *this,我们可以在函数返回时返回调用该函数的对象,从而支持方法链调用。

2. 本质

this 指针的本质是一个常量指针,其类型为 ClassName* const,指向调用该成员函数的对象实例。它不可修改,即我们无法改变 this 指针指向的对象。

例如,当你调用 obj.SetValue(5) 时,实际上执行的函数是 SetValue(&obj, 5)this 指针指向了对象 obj,从而确保函数操作的是正确的对象。

3. 特点

  1. 只能在非静态成员函数中使用:全局函数和静态成员函数中都无法使用 this 指针。
  2. 生命周期与成员函数一致this 指针在成员函数调用时被创建,并在函数执行结束时销毁。
  3. 存储位置因编译器而异this 指针可能存储在栈、寄存器或全局变量中,具体取决于编译器的实现。

4. this 指针的作用机制

为了深入理解 this 指针的作用,我们可以将 C++ 代码转换为 C 代码。在 C 语言中,没有类的概念,但我们可以用结构体和全局函数来模拟类和成员函数:

structCar{int price;};voidSetPrice(structCar*this,int price){this->price = price;}intmain(){structCar car;SetPrice(&car,20000);return0;}

上面的 C 代码模拟了 C++ 的类机制,其中 SetPrice 函数需要传入 Car 结构体的指针才能访问其成员变量。这就相当于 C++ 中 this 指针的工作方式。

5. 成员函数中的 this 指针

非静态成员函数中默认会包含 this 指针。例如,在成员函数中调用其他成员函数或访问成员变量时,编译器实际上是通过 this 指针来完成的:

classCar{public:int price;voidsetPrice(int p){this->price = p;// this 指向调用该函数的对象}};

6. 空指针与 this 指针的特殊情况

在某些极端情况下,this 指针可能为空。例如,当我们通过空指针调用一个没有访问成员变量的成员函数时,程序不会崩溃

classA{public:voidsayHello(){ std::cout <<"Hello"<< std::endl;}};intmain(){ A* ptr =nullptr; ptr->sayHello();// 输出 "Hello"}

因为前一篇文章我们说过成员函数地址是编译时确定的,不是存在对象里面的,而是单独存在一个代码段里,所以这里面没有解引用。

然而,如果该成员函数访问了成员变量,程序将崩溃,因为 this 指针为空,指向了非法内存区域。

7. 注意事项

  • 静态成员函数无法使用 this 指针,因为它们属于类本身,而不是类的具体实例。因此,静态成员函数无法访问非静态成员变量。
  • C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

8. 总结

this 指针是 C++ 中的一个重要机制,帮助成员函数与对象实例关联。它在类的成员函数内部自动存在,指向调用该函数的对象实例。通过掌握 this 指针的用法,开发者可以更好地理解面向对象编程的原理,并编写更加灵活和健壮的代码。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

Read more

《开源圈聚焦的技术新作:讯飞 Astron Agent 的 “工作流编排 + MCP 工具集”,如何降低企业智能体开发门槛》

《开源圈聚焦的技术新作:讯飞 Astron Agent 的 “工作流编排 + MCP 工具集”,如何降低企业智能体开发门槛》

前引:今天我们不谈趣味互动类的小智能体,而是聚焦又一个开源的企业级智能体 “基建”—— 讯飞星辰推出的 Astron Agent。作为讯飞首个开源的企业级智能体平台,它把 AI 工作流编排、RPA 自动化、MCP 工具集打包成了可直接复用的基座,刚上线 GitHub 就拿下 6k+ Star,连科技圈都在讨论它怎么降低企业做智能体的门槛! 本文将聚焦于:与其同时开源的RPA介绍及智能体平台Astron Agent 中各个工具的详细使用                                    不是广告!不是广告!不是广告!真心推荐! 目录  【一】Astron智能体平台介绍 【二】RPA介绍 【三】Astron部署登录 (2)登录过程 (2)全程体验 【四】几个重要工具详解 (1)什么是系统/用户提示词 (2)代码节点 (3)什么时候用知识库 (4)

By Ne0inhk

开源版Claude Code来了,48小时的深度使用教程

Datawhale干货  作者:筱可,Datawhale成员 最近 Claude 凭借 Computer Use 等一系列骚操作确实赚足了眼球,也让大家看到了差距。 这也让人想起 Anthropic CEO Dario 之前那句有点扎心的话——他说中国模型主要是在刷榜,实际推理和应用能力跟顶尖模型还有距离。 但月之暗面创始人杨植麟亲自发布的 Kimi K2.5,或许算是一次脚踏实地的追赶。 为什么关注:开源界的实力派 如果你问我 Kimi K2.5 的实际体验到底在一个什么水平? 在我充分体验了 Kimi Code + K2.5 的组合后,最直观的感觉是:它像是一个开源版的 Gemini 3 Pro 与 Claude Sonnet 4.5 的结合体。 先说差距。从官方放出的 SWE-bench

By Ne0inhk
神级开源,一站式、轻量级、低门槛、零侵入的 Java 应用全方位监控平台,开箱即用!!!

神级开源,一站式、轻量级、低门槛、零侵入的 Java 应用全方位监控平台,开箱即用!!!

一、前言 Java 应用开发的同学都知道,项目上线后,日志可视化查询、接口性能监控、慢请求分析、调用链监控、JVM 可视化监控是一件非常重要的事。 市面上对于上对于日志的可视化查询、接口的性能监控、调用链监控、JVM 的可视化监控都有常用的方案。 * 日志可视化查询:ELK/EFK。 * JVM 可视化监控与接口性能:Actuator + Prometheus + Grafana。 * 调用链监控:PingPoint、Skywalking、Zipkin 等。 不过对于很多开发者来说,这中间存在大量繁琐的配置过程,且具备一定的使用学习门槛,部署成本与运维成本也比较高。 而对于大多数中小型企业或者个人开发者来说,并不想要这么大的投入,但又想要对应用做全方位的监控管理该怎么办? 小编今天要介绍的就是这样一款可免费使用的 Java 应用全方位监控平台。一站式、轻量级、低门槛、零侵入,开箱即用。 旨在于以极简、高效的方式,在一个平台上实现 Java 应用的日志采集与可视化查询、接口性能监控、

By Ne0inhk