“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”的引用时,必须保证调用者不要销毁对象)