C++中不使用this指针时如何正确解引用实例变量指针?
不用
this指针时,正确解引用链表节点的next指针 嘿,刚学C++指针时踩链表的坑太正常了——我当初也在解引用和成员访问上绕了好久!不用this指针完全可以正确操作类里的next指针,核心是要避开变量遮蔽的问题,同时用对解引用的语法。
先明确核心语法:指针解引用访问成员
不管是类内还是类外,解引用指针访问成员有两种等价写法:
- 显式解引用:
(*指针变量).成员名 - 语法糖(更常用):
指针变量->成员名
这两种写法效果完全一样,后者是前者的简化版,写起来更清爽。
类内成员函数中不用this的正确写法
假设你的链表节点类大概是这样的(简化版):
class ListNode { private: int value; ListNode* next; // 你的实例变量:指向下一个节点的指针 public: ListNode(int val) : value(val), next(nullptr) {} // 示例:获取下一个节点的值(不用this) int getNextValue() { // 这里直接用next,因为没有局部变量/参数叫next,编译器会自动识别为成员变量 if (next != nullptr) { // 两种写法任选其一 return (*next).value; // 或者 return next->value; } return -1; // 用一个特殊值表示没有下一个节点 } // 示例:设置下一个节点(不用this) void setNext(ListNode* newNext) { // 同样直接用成员变量next,参数名改成newNext避免和成员变量重名 next = newNext; } };
最容易踩的坑:变量遮蔽
如果你在成员函数里定义了和next同名的参数或局部变量,直接写next会优先访问局部的那个,而不是类的成员变量——这时候如果不用this,就要修改参数/局部变量的名字,避免冲突。
比如下面就是错误写法:
// 错误:参数名和成员变量next重名,这里的next指的是参数,不是成员变量 void setNext(ListNode* next) { next = next; // 相当于把参数赋值给自己,完全没修改类里的next! }
改成下面这样就没问题了:
// 正确:把参数名改成newNext,避免遮蔽成员变量 void setNext(ListNode* newNext) { next = newNext; // 这里的next就是类的成员变量,不需要this }
类外访问对象的next指针
如果要在类外访问某个链表节点的next指针,首先要确保next是public的,或者类提供了getNext()这样的成员函数(更符合封装原则),然后同样用解引用语法:
int main() { ListNode node1(10); ListNode node2(20); node1.setNext(&node2); // 假设类有getNext()函数返回next指针 ListNode* nextNode = node1.getNext(); if (nextNode != nullptr) { cout << nextNode->value << endl; // 输出20 // 或者 cout << (*nextNode).value << endl; } return 0; }
总结一下
- 在类的成员函数里,只要没有同名的局部变量/参数,直接用
next就代表类的成员指针 - 解引用访问成员用
指针->成员或(*指针).成员都可以,前者更常用 - 避免变量遮蔽是不用
this的关键——如果有重名,优先改局部变量/参数的名字
内容的提问来源于stack exchange,提问作者theGoerner
相关产品推荐
相关产品推荐

