C++ this指针数量疑问及验证程序错误修正求助
问题解答
一、修正你的验证程序
你的代码出现lvalue错误,是因为this在C++中是右值(prvalue),不能对它取地址(&this是非法操作)。我们只需要直接输出this的值(它本身就是指向当前对象的指针),同时可以输出对象自身的地址做对比,验证this确实指向调用函数的对象。
修正后的代码:
#include <iostream> #include <cstring> using namespace std; class person { char name[10]; int age; public: person() {} person(const char* s, int a) { strcpy(name, s); age = a; } void display(void) { // 直接输出this的值(指向当前对象的指针) cout << "this points to: " << this << endl; } }; int main() { person A("Jimmy", 12), B("Joe", 44), C("Alice", 25), D("Bob", 30); cout << "Address of A: " << &A << endl; A.display(); cout << "\nAddress of B: " << &B << endl; B.display(); cout << "\nAddress of C: " << &C << endl; C.display(); cout << "\nAddress of D: " << &D << endl; D.display(); return 0; }
运行后你会看到,每个对象调用display时,this的值和对象自身的地址完全一致,证明this确实指向当前调用成员函数的对象。
二、关于this指针的数量问题
首先明确:对象本身并不存储this指针,this是C++编译器在调用非静态成员函数时,自动传递给函数的一个隐式参数(本质是函数的局部变量)。
对于四个对象的场景:
- 当调用某个对象的成员函数时,编译器会把该对象的地址作为
this参数传递给函数,此时函数内部的this就指向这个对象; - 每次调用成员函数(不管是同一个对象还是不同对象),都会生成一个独立的
this副本(作为函数栈上的局部变量); - 没有调用成员函数时,不存在对应的
this指针。
所以不存在“程序中有多少个this指针存在”的固定答案——它取决于当前有多少个成员函数正在执行:如果同时有两个成员函数在运行(比如多线程场景),就会有两个不同的this指针;如果没有成员函数执行,就没有this指针存在。
你的最初直觉有部分正确(this指向调用成员函数的对象),但误解了它的存在形式:this不是全局唯一的,而是每次成员函数调用时的临时局部参数,每个调用对应一个this副本。
内容的提问来源于stack exchange,提问作者Vinayak Deshmukh
相关产品推荐
相关产品推荐

