【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

Microsoft Visual C++ 6.0 中文版下载与安装教程,附详细图文,建议收藏

Microsoft Visual C++ 6.0 中文版下载与安装教程,附详细图文,建议收藏

Microsoft Visual C++ 6.0 下载与安装教程 1. 软件介绍 Microsoft Visual C++(简称 VC++ 或 VC)是 Microsoft 公司推出的 C++ 语言开发工具,广泛用于 Windows 平台软件开发。它具有强大的集成开发环境(IDE),提供了代码编辑、调试、编译等一站式开发体验。 Microsoft Visual C++ 6.0(简称 VC6.0)是微软于 1998 年发布的经典 C++ 编译器,集成了 MFC 6.0,提供了标准版(Standard Edition)、专业版(Professional

By Ne0inhk
GESP2024年3月认证C++二级( 第二部分判断题(1-10))

GESP2024年3月认证C++二级( 第二部分判断题(1-10))

🌟 第1题 1、题目说:输出是 28.5 ❌ 错误 2、🎬 小数变整数魔法 (1)int(s) 是什么意思? 👉 强制转成整数! int(18.5) → 18 不会四舍五入,而是直接“砍掉小数”。 (2)所以: t = 18 + 10 = 28 不是 28.5。 🌟 第2题 1、Xyz、xYz、xyZ 是不同变量? ✅ 正确 2、🎬 大小写敏感王国 (1)C++ 是大小写敏感的语言! abc ≠ Abc ≠ aBc (2)就像: 大李 小李 老李

By Ne0inhk
**解锁 C++ std::map 的力量**

**解锁 C++ std::map 的力量**

前言         前几天我们探讨了 C++ 中 set 的使用方法,今天咱们就趁热打铁,继续聊聊标准库中另一个非常重要的关联容器——map。 1.map类的介绍         首先,我们可以先看一下在源码中map的声明是什么: template < class Key, // map::key_type class T, // map::mapped_type class Compare = less<Key>, // map::key_compare class Alloc = allocator<pair<const Key,T> > // map::allocator_type > class

By Ne0inhk
【C++】多态

【C++】多态

多态 ✨前言:在 C++ 的世界里,“多态(polymorphism)” 是面向对象编程的灵魂之一。 它让同一个接口在不同对象上表现出不同的行为,从而大大提升了代码的复用性、扩展性与灵活性。 本文将带你深入理解多态的核心原理,从概念、实现条件、虚函数、重写规则,到虚函数表与动态绑定机制,逐步揭开多态背后的运行逻辑。 📖专栏:【C++成长之旅】 目录 * 多态 * 一、多态的概念 * 二、多态的定义及实现 * 2.1 多态的构成条件 * 2.1.1 实现多态还有两个必须重要条件: * 2.1.2 虚函数 * 2.1.3 虚函数的重写/覆盖 * 2.1.4 多态场景的⼀个选择题 * 2.1.

By Ne0inhk