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
相关产品推荐
相关产品推荐

