C++ this 指针

2025 年 8 月 29 日 | 阅读 9 分钟

在 C++ 编程中,this 是一个关键字,它指向类的当前实例。类对象可以在其成员函数中使用 this 指针访问自身。理解 this 指针是我们在面向对象结构中操作函数(如自引用调用、方法链和运算符重载)的关键前提。

换句话说,this 指针是一个隐式的内置指针,它在类的所有成员函数(静态成员除外)内部运行。通过 this 指针,调用对象获取其内存地址,同时实现成员的访问。

语法

一个简单的语法定义了这个指针。成员函数可以使用 this 关键字来访问指向调用对象的指针。

C++ 简单的 this 指针示例

让我们看一个简单的例子来演示 C++ 中的 this 指针。

示例

编译并运行

输出

This pointer holds: 0x7fff8452e647

C++ 另一个 this 指针示例

让我们以另一个 C++ 中 this 关键字的示例来说明它指向当前类的字段。

示例

编译并运行

输出

101 John 890000
102 Alice 59000

this 指针的特性

C++ 中 this 指针的几个特性如下:

  • this 指针仅存在于成员函数中,因为静态函数属于类结构而不是对象结构。
  • 在成员函数执行期间,系统会自动创建 this 指针。
  • this 指针包含调用对象的地址,但仍然可以修改。
  • 静态函数不允许使用 this 关键字,因为静态成员操作的是非特定实例。
  • 方法链和运算符重载,以及命名冲突的解决,都依赖于 this 指针的使用。

this 指针在 C++ 中的用途

  • 它可以用于将当前对象作为参数传递给另一个方法。
  • 它可以用于引用当前类的实例变量。
  • 它可以用于声明索引器。
  • 可以通过 this 指针来解析函数参数和成员变量。
  • 它提供了一种编写更清晰的代码的方法,该代码通过方法链可以更有效地运行。
  • this 的使用使得在从当前实例返回对象引用时可以进行运算符重载。

使用 this 指针的不同方法

C++ 中有几种使用 this 指针的方法。其中一些如下:

1. 访问数据成员

在 C++ 中,当函数包含与对象成员变量同名的参数时,this 指针用于解决命名冲突。

C++ 使用 this 指针访问数据成员示例

让我们来看一个在访问数据成员时使用 this 指针的示例程序。

示例

编译并运行

输出

value of x:10

说明

类数据成员 x 和 setX 函数中的参数 x 同名。通过使用 this->x = x;,消除了歧义,并将参数的值赋给了对象的该数据成员。

2. 返回对象(方法链)

在 C++ 中,方法链技术成为可能,因为返回 *this(this 指针)允许在一个语句中进行多次函数调用。

C++ 使用 this 指针进行方法链示例

让我们来看一个在方法链中使用 this 指针的示例程序。

示例

编译并运行

输出

Value: 10

说明

该程序使用了方法链,其中 setValue(int v) 设置值并返回对象,允许在同一个语句中调用 display():obj.setValue(10).display();。

3. 传递当前对象

在 C++ 中,this 指针解决了将当前对象实例传递给接受对象的任何函数或方法的需要。

C++ 传递当前对象示例

让我们来看一个在传递当前对象时使用 this 指针的示例程序。

示例

编译并运行

输出

Inside show() function

说明

该程序演示了使用 this 指针传递当前对象。execute() 函数调用 invoke(this),然后调用传递对象的 show(),打印“Inside show() function”。

4. 在运算符重载中使用 "this" 指针

运算符重载中,"this" 指针提供了一种返回对修改对象的引用的方法。

C++ 使用 this 指针进行运算符重载示例

让我们来看一个在运算符重载中使用 this 指针的示例程序。

示例

编译并运行

输出

Number: 15

说明

该程序演示了使用 this 指针进行方法链。add(int n) 函数修改 num 并返回 *this,允许 obj.add(10).print(); 在单个语句中执行这两个函数。

在 C++ 构造函数中使用 this 指针

在类构造函数内部,this 指针作为对活动对象实例的引用。在 C++ 中,this 指针提供了多种优势,包括对象初始化以及用于方法链功能的名称解析服务。

1. 解决构造函数中的名称冲突

当构造函数参数与类成员具有相同的名称时,this 指针充当区分方法。

  • 构造函数返回 this 指针以启用方法链
  • 通过 this 指针可以实现方法链,因为它返回对象的当前实例。

让我们来看一个在 C++ 构造函数中解决名称冲突的 this 指针的示例。

示例

编译并运行

输出

Constructor called. Value initialized: 10
Current Value of x: 20

说明

该程序显示了使用 this 指针的构造函数初始化和方法链。构造函数解决了名称冲突,而 SetValue (Int Val) 更新 X 并返回它,允许 obj.setvalue (20)->display(); 在一个语句中执行这两个任务。

2. 在 C++ 中删除 "this" 指针

在 C++ 中,"this" 指针是每个类成员函数在执行期间用于访问当前对象的隐式地址。通常避免删除 this 指针,除非非常有必要。

仅当满足以下两个条件时,成员函数才能删除 this 指针:

  • 通过 new 对此对象进行动态分配。
  • 删除对象可防止启动任何新的系统访问。

语法

它具有以下语法:

C++ 删除 this 指针示例

让我们给出一个在 C++ 中删除 this 指针的示例。

示例

编译并运行

输出

Deleting the current object...

说明

该程序展示了使用 this 指针的方法链,其中 destroy() 动态删除已分配的对象。add(int n) 函数修改 num 并返回 *this,允许 obj.add(10).print(); 在单个语句中执行这两个函数。

this 指针在 C++ 中的影响

"this" 指针在 C++ 编程中提供了各种操作。

  • 访问当前对象:通过使用 this 指针,可以实现编程访问当前对象成员。
  • 方法链:通过 this 指针可以实现方法链,因为它提供了对调用对象的引用。
  • 避免名称冲突:this 的使用解决了局部变量名称与数据成员名称匹配而引起的冲突。
  • 运算符重载:运算符重载功能依赖于 this 指针,它从调用位置返回对象引用。

this 指针的局限性

C++ 中 this 指针的几个局限性如下:

  • 无法修改:程序员无法更改 this 指针的基本属性,因为它保持默认且不可逆。
  • 在静态函数中不可用:静态函数中无法访问 this 指针,因为它们不属于任何对象实例。
  • 仅限于类作用域:只有非静态类成员可以将此指示符指定为操作。

结论

最后,this 指针通过 C++ 软件开发中的可靠对象处理,帮助开发人员同时编写清晰的代码。正确使用此指示符可提高程序的效率,尤其是在开发面向对象的代码库时。

通过正确使用 this 指针,开发人员可以创建小型、可适应且易于维护的 C++ 代码。此指针的主要缺点在于静态工作以及其不可访问的特性,仅具有只读特性。


C++ this 指针选择题

1. C++ 指针有什么引用?

  1. 基类地址
  2. 调用对象地址
  3. 对象内存大小
  4. 对象第一个数据成员的值
 

答案:B. 调用对象地址

2. 评估以下关于 this 指示符的陈述

稳定成员可以使用此指示符。

  1. 静态成员函数可以访问 this 指针。
  2. 它用于分配另一个对象的地址。
  3. 非静态成员函数的初始化在其被调用时自动发生。
  4. 成员变量需要 this 指针才能访问。
 

答案:C. 非静态成员函数的初始化在其被调用时自动发生。

3. 如何使用 this 指针解决类中的名称冲突?

应该在空白处填写什么才能正确地将参数 x 的值设置到数据成员 x?

  1. x
  2. this->x
  3. Demo::x
  4. *this.x
 

答案:B. this->x

4. 以下 C++ 程序可能的输出是什么?

  1. 该程序显示了两次相同的地址。
  2. 打印不同的内存地址
  3. 编译器错误
  4. 打印垃圾值
 

答案:B. 打印不同的内存地址

5. 以下哪一项是 this 指针的有效用例?

  1. 访问静态数据成员
  2. 在用于方法链时,可以将当前对象返回到调用上下文。
  3. 在构造函数中初始化基类
  4. 将其存储在全局指针变量中
 

答案:B. 在用于方法链时,可以将当前对象返回到调用上下文。


下一主题C++ static