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

“this”这个关键字

一、什么是“this”?

简单来说,“this”是每个非静态成员函数隐含的指针,它指向调用该成员函数的那个对象本身

换句话说,当你调用对象的方法时,编译器会自动传入一个指针,指向你调用的“那个对象”,这个指针就是“this”。

比喻

把对象比作一辆车,“this”就像车内的一个标签,指向“这辆车自己”。每次在车内(成员函数中),你可以用“this”找到“自己”。


二、“this”的详细作用和用途

2.1 指向调用对象

  • 让成员函数知道“自己是谁”
  • 可以在成员函数中访问和修改调用者的成员

2.2 解决名字冲突

如果成员函数的参数和成员变量同名,会造成混淆。此时,用“this”可以明确区分:

class Person {
public:std::string name;void setName(const std::string& name) {this->name = name;  // 成员变量名 vs 参数名}
};

这里,this->name指成员变量,name是参数。

2.3 返回对象本身(链式调用)

“this”作为指针,可以用在函数返回值中,让函数支持链式调用(一个语句连续调用多个方法):

class Number {
public:int value;Number& setValue(int v) {this->value = v;return *this;  // 返回对象的引用}Number& add(int v) {this->value += v;return *this; }
};

这样就可以写:

Number n;
n.setValue(10).add(5);

2.4 在const成员函数中的使用

  • 在定义const成员函数时,不能修改对象的成员
  • 但可以用“this”作为“const 类型指针”:
class Example {
public:void display() const {// this 是 const指针:const Example*// 不能通过 this 修改成员}
};

2.5 判断两个对象是否相等

可以用“this”进行比较:

bool isEqual(const Person& p) {return this == &p;
}

三、“this”的底层实现原理

  • 每个非静态成员函数都会隐式带一个指针参数(隐藏参数)
  • 编译器会在调用成员函数时自动把调用的对象地址作为“this”传入
  • “this”在成员函数中象一个普通指针,可以用->访问成员
  • 这也是为什么成员函数定义时可以用this->member,实际上就是解指针访问

举个简单的例子: 

class Foo {
public:void bar() {// 实际编译后类似// void bar(Foo* this) { ... }}
};

四、例子演示

让我们写几个例子,帮你更直观理解:

例子1:解决名字冲突

#include <iostream>
class Person {
public:std::string name;void setName(const std::string& name) {this->name = name; // 使用this区分成员和参数}void print() {std::cout << "Name: " << this->name << std::endl;}
};
int main() {Person p;p.setName("Alice");p.print();  // 输出:Name: Alice
}

例子2:链式调用

#include <iostream>
class Counter {
public:int value = 0;Counter& increment() {this->value++;return *this;  // 返回自身引用}Counter& add(int v) {this->value += v;return *this;}void show() {std::cout << "Counter: " << this->value << std::endl;}
};
int main() {Counter c;c.increment().add(10).increment().show();  // 链式调用
}

例子3:判断对象是否相等

#include <iostream>
class Person {
public:std::string name;bool isSame(const Person& p) {return this == &p; // 比较指针是否相等}
};
int main() {Person p1{"Tom"};Person p2{"Tom"};std::cout << p1.isSame(p2) << std::endl; // false
}

五、总结与注意事项

  • **“this”**始终指向调用的对象
  • 在成员函数中可用,但不能在静态成员函数中使用
  • 常用于名字冲突解决和链式调用
  • 使用“*this”可以获得“对象本身”,但要小心存储或返回对象引用,避免悬空指针或引用(比如返回“this”的引用时,必须保证调用者不要销毁对象)
http://www.dtcms.com/a/191954.html

相关文章:

  • Node.js
  • ip命令详解
  • 死锁(Deadlock)知识点详解
  • YOLO v3:目标检测领域的质变性飞跃
  • 大语言模型 08 - 从0开始训练GPT 0.25B参数量 - MiniMind 单机多卡 torchrun deepspeed
  • 量化交易 - 网格交易策略实现与原理解析
  • 【Conda】环境应用至JupyterLab
  • Python课程及开源项目推荐
  • 399. 除法求值
  • 遗传算法求解旅行商问题分析
  • 【FMC216】基于 VITA57.1 的 2 路 TLK2711 发送、2 路 TLK2711 接收 FMC 子卡模块
  • [学习]RTKLib详解:tle.c(系列终章)
  • Android 图片自动拉伸不变形,点九
  • windows ffmpeg msvc x64编译
  • pytorch训练可视化工具---TensorBoard
  • 【web应用】配置Java JDK与maven3的环境变量
  • Docker实现MySQL数据库主从复制
  • 《棒球百科》市运会是什么级别的比赛·棒球1号位
  • nt!MiAllocateWsle函数分析之设置Wsle[WorkingSetIndex]
  • Golang
  • 基于策略的强化学习方法之近端策略优化(PPO)深度解析
  • 2025.05.14华为机考笔试题-第一题-100分
  • xp_cmdshell bcp 导出文件
  • 测试--BUG(软件测试⽣命周期 bug的⽣命周期 与开发产⽣争执怎么办)
  • 牛客网NC22157:牛牛学数列2
  • 编程题 03-树3 Tree Traversals Again【PAT】
  • AI实时对话的通信基础,WebRTC技术综合指南
  • GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
  • Go 语言中接口类型转换为具体类型
  • Automatic Recovery of the Atmospheric Light in Hazy Images论文阅读