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

C++中如何通过this指针正确解引用访问类的指针成员变量

C++ this指针访问类指针成员的错误修正

语法报错原因

你的this->(*width)写法违反了C++运算符优先级规则:->成员访问运算符的优先级高于*解引用运算符,编译器无法识别你写的语法结构。

正确写法

要先通过this拿到指针成员width,再对指针做解引用操作,两种等价写法:

  • 带this指针:*(this->width)
  • 省略this指针(类成员函数内可直接访问成员):*width

修正后的show_data函数代码:

void show_data(){
    cout<<"inside show_data"<<endl;
    cout<<this->length;
    cout<<*(this->width);
    cout<<*width; // 省略this的写法效果相同
}

额外隐藏问题修复

你当前代码存在更严重的野指针风险:
set_data函数中this->width=&width;是把函数形参width的栈地址赋值给成员指针,形参在set_data执行结束后就会被销毁,后续访问*width属于访问非法内存,会触发未定义行为。

推荐修复方案(不需要额外内存管理,最简单可靠):
把成员变量int *width直接改为int width,不需要用指针存储,对应修改成员函数逻辑即可:

class paper{
private:
    int length;
    int width; // 改为int类型,不用指针

public:
    void set_data(int length, int width){
        cout<<"inside set data"<<endl;
        this->length=length;
        this->width=width; // 直接赋值,不需要取地址
    }
    void show_data(){
        cout<<"inside show_data"<<endl;
        cout<<this->length;
        cout<<this->width;
    }
};

如果确实需要保留指针成员,需要主动申请堆内存存储值,并且在析构函数中释放避免内存泄漏:

class paper{
private:
    int length;
    int *width;

public:
    paper() : width(nullptr) {} // 构造函数初始化指针为空
    ~paper() { delete width; } // 析构函数释放申请的堆内存

    void set_data(int length, int width){
        cout<<"inside set data"<<endl;
        this->length=length;
        if(this->width == nullptr) {
            this->width = new int; // 申请堆内存
        }
        *(this->width) = width; // 给堆内存赋值
    }
    void show_data(){
        cout<<"inside show_data"<<endl;
        cout<<this->length;
        if(width != nullptr) {
            cout<<*(this->width);
        }
    }
};

内容的提问来源于stack exchange,提问作者Sarthak Gandhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:06:03