You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:08:17