1.88、this指针是什么,我们可以删除它吗?
在C++里,this指针是个隐藏的“超级英雄”。它存在于每个非静态成员函数里,悄悄指向当前正在操作的对象。啥意思呢?想象你写了个类叫Dog
,里面有个函数bark()
。当你用某个Dog
对象调用bark()
时,this就自动指向那个对象,告诉你:“嘿,我就是那个正在汪汪叫的狗!”
this->name
就是访问当前对象的name
。这玩意儿是编译器偷偷塞给你的,你不用定义它,但用起来可方便了。
我们能删除它吗?别冲动,后果很严重!
现在进入正题:能不能删了this?答案是不能随便删,但技术上可以“自毁”(用delete this
),不过我先劝你一句:别轻易尝试,99%的情况下这是给自己挖坑!
为啥不能删?因为this不是你手动分配的内存,它是编译器管理的一个“内置指针”,指向当前对象。你要是delete this
,相当于把当前对象从内存里抹掉,但指针本身并不会消失,之后再用这个对象就成了“悬挂指针”,程序很可能直接崩掉。更别提,如果你是在栈上的对象(不是用new
创建的),delete this
压根儿就是非法操作,编译器都不让你过。
我的观点是:this的存在是为了让对象“认识自己”,你删它干嘛?它是C++面向对象设计的灵魂,删了就等于自废武功。接下来,我用两个案例带你彻底搞懂。
小案例1:this的“自我介绍”功能
先看个简单例子,帮你秒懂this的用法。假设我们有个Person
类,每个对象有自己的名字,成员函数sayHello()
会用this访问名字并打招呼:
#include <iostream>
#include <string>
class Person {
public:
std::string name;
Person(std::string n) : name(n) {} // 构造函数初始化名字
void sayHello() {
std::cout << "你好,我是" << this->name << "!" << std::endl;
}
};
int main() {
Person alice("Alice"); // 创建一个名叫Alice的对象
alice.sayHello(); // 输出:你好,我是Alice!
return 0;
}
代码解析:
- • 当
alice.sayHello()
被调用时,sayHello()
里的this
自动指向alice
对象。 - •
this->name
就是alice.name
,所以输出“Alice”。 - • 这里用
this->name
而不是直接写name
是为了明确告诉你:this在幕后干活儿!其实写name
也行,编译器会自动帮你补上this->
。
这个例子是不是很简单?this就像个“自我指认器”,告诉函数“我是谁”。
小案例2:删除this?自毁的后果你承受不起!
再来看个“危险”案例,展示delete this
的坑。假设我们有个类SelfDestruct
,里面有个函数试图“自杀”:
#include <iostream>
class SelfDestruct {
public:
void destroyMyself() {
std::cout << "正在自毁..." << std::endl;
delete this; // 自毁当前对象
}
};
int main() {
SelfDestruct* obj = new SelfDestruct(); // 在堆上创建对象
obj->destroyMyself(); // 自毁
// obj现在是悬挂指针,再用它会出问题
std::cout << "自毁后还能干啥?" << std::endl; // 未定义行为,可能会崩
return 0;
}
代码解析:
- •
new SelfDestruct()
在堆上分配了一个对象,obj
是指向它的指针。 - • 调用
obj->destroyMyself()
时,delete this
把对象删了,内存被释放。 - • 但
obj
还是指向原来的地址,现在成了悬挂指针。如果你再用obj
(比如调用其他函数),程序就可能崩溃,或者干出啥怪事,完全不可预测。 - •
delete this
只适用于堆上的对象(用new
创建的)。栈上的对象(比如SelfDestruct obj;
)不能删,强行删会报错。 - • 即便合法,
delete this
后你得确保没人再用这个对象,否则就是自找麻烦。
总结:this不能删,也没必要删!
好了,咱们把this指针聊透了。它是C++里对象“自我认知”的关键,帮你在成员函数里找到“自己”。能不能删?技术上可以,但后果自负,而且压根儿没必要。希望这两个案例让你不只懂了this,还能举一反三,下次写代码时心里更有底!
参考文献
- • C++ Primer, 5th Edition by Stanley B. Lippman, Josée Lajoie, and Barbara E. Moo
- • Effective C++, 3rd Edition by Scott Meyers
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)





赶快来坐沙发