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

[复制链接]
发表于 2025-11-6 05:09:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×



弁言

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

1.1 隐式存在的 this 指针

在 C++ 中,每个非静态成员函数都会隐式包罗一个 this 指针,它指向调用该成员函数的对象实例。对于开辟者来说,this 指针无需显式声明或转达,它由编译器主动管理。
1.2 this 指针的用途与示例

this 指针最常见的用途是办理成员变量与函数参数同名的题目,别的它还可以用于在成员函数中返回对象自己。比方:
  1. class Person {
  2. public:
  3.     Person(int age) {
  4.         this->age = age;  // 用 this 指针区分成员变量和参数
  5.     }
  6.     Person& addAge(int age) {
  7.         this->age += age;
  8.         return *this;  // 返回对象本身
  9.     }
  10.     int age;
  11. };
复制代码
在上面的代码中,当函数的参数 age 与类的成员变量 age 同名时,我们利用 this->age 来明确体现成员变量。别的,通过 return *this,我们可以在函数返回时返回调用该函数的对象,从而支持方法链调用。
2. 本质

this 指针的本质是一个常量指针,其范例为 ClassName* const,指向调用该成员函数的对象实例。它不可修改,即我们无法改变 this 指针指向的对象。
比方,当你调用 obj.SetValue(5) 时,实际上实验的函数是 SetValue(&obj, 5)。this 指针指向了对象 obj,从而确保函数利用的是精确的对象。
3. 特点


  • 只能在非静态成员函数中利用:全局函数和静态成员函数中都无法利用 this 指针。
  • 生命周期与成员函数同等:this 指针在成员函数调用时被创建,并在函数实验竣事时烧毁。
  • 存储位置因编译器而异:this 指针大概存储在栈、寄存器或全局变量中,详细取决于编译器的实现。
4. this 指针的作用机制

为了深入明确 this 指针的作用,我们可以将 C++ 代码转换为 C 代码。在 C 语言中,没有类的概念,但我们可以用布局体和全局函数来模仿类和成员函数:
  1. struct Car {
  2.     int price;
  3. };
  4. void SetPrice(struct Car* this, int price) {
  5.     this->price = price;
  6. }
  7. int main() {
  8.     struct Car car;
  9.     SetPrice(&car, 20000);
  10.     return 0;
  11. }
复制代码
上面的 C 代码模仿了 C++ 的类机制,此中 SetPrice 函数须要传入 Car 布局体的指针才气访问其成员变量。这就相当于 C++ 中 this 指针的工作方式。
5. 成员函数中的 this 指针

非静态成员函数中默认会包罗 this 指针。比方,在成员函数中调用其他成员函数或访问成员变量时,编译器实际上是通过 this 指针来完成的:
  1. class Car {
  2. public:
  3.     int price;
  4.     void setPrice(int p) {
  5.         this->price = p;  // this 指向调用该函数的对象
  6.     }
  7. };
复制代码
6. 空指针与 this 指针的特别环境

在某些非常环境下,this 指针大概为空。比方,当我们通过空指针调用一个没有访问成员变量的成员函数时,步伐不会瓦解
  1. class A {
  2. public:
  3.     void sayHello() { std::cout << "Hello" << std::endl; }
  4. };
  5. int main() {
  6.     A* ptr = nullptr;
  7.     ptr->sayHello();  // 输出 "Hello"
  8. }
复制代码
由于前一篇文章我们说过成员函数地点是编译时确定的,不是存在对象内里的,而是单独存在一个代码段里,以是这内里没有解引用。
然而,假如该成员函数访问了成员变量,步伐将瓦解,由于 this 指针为空,指向了非法内存地区。
7. 留意事项



  • 静态成员函数无法利用 this 指针,由于它们属于类自己,而不是类的详细实例。因此,静态成员函数无法访问非静态成员变量。
  • C++规定不能在实参和形参的位置体现的写this指针(编译时编译器会处置惩罚),但是可以在函数体内体现利用this指针。
8. 总结

this 指针是 C++ 中的一个紧张机制,资助成员函数与对象实例关联。它在类的成员函数内部主动存在,指向调用该函数的对象实例。通过把握 this 指针的用法,开辟者可以更好地明确面向对象编程的原理,并编写更加机动和结实的代码。
结语

本日的分享到这里就竣事啦!假如以为文章还不错的话,可以三连支持一下。
也可以点点关注,制止以后找不到我哦!
Crossoads主页另有许多风趣的文章,接待小搭档们前往点评,您的支持就是作者进步的动力!

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表