如何在C++类成员函数中利用this交换自身与同类型指针的地址
双向链表swap函数优化:交换对象地址的思路不可行,正确实现看这里
为什么你的代码编译报错?
this在C++中是不可修改的指针常量(右值指针),它指向当前对象,但你不能给this赋值——就像不能写5 = 3一样,右值无法作为赋值操作的左操作数,所以this = temp会触发编译错误。
直接交换对象地址的思路根本行不通
就算编译器允许给this赋值,这种操作也完全达不到交换两个链表的目的:
- 函数里的
rhs是指针参数,你修改的只是函数内部的指针副本,外部调用者手里的对象地址不会有任何变化。 - 对象的内存地址在创建后就固定了,无法通过赋值改变已存在对象的地址。
正确的优化方案:交换链表的内部核心成员
既然复制节点数据效率低,我们不需要动节点本身,只需要交换两个链表对象的内部管理指针和状态(比如头指针、尾指针、链表长度),这些成员数量极少,交换操作是O(1)时间复杂度,完全解决性能问题。
假设你的dLinkedList类定义包含以下核心成员:
class dLinkedList { private: struct Node { int data; Node* prev; Node* next; }; Node* head; // 头节点指针 Node* tail; // 尾节点指针 size_t size; // 链表长度 public: void swap(dLinkedList& rhs); // 其他成员函数... };
对应的swap函数实现:
#include <algorithm> // 用于std::swap void dLinkedList::swap(dLinkedList& rhs) { // 直接交换三个核心成员,std::swap会自动处理临时变量 std::swap(head, rhs.head); std::swap(tail, rhs.tail); std::swap(size, rhs.size); }
如果不想依赖<algorithm>,也可以手动实现交换:
void dLinkedList::swap(dLinkedList& rhs) { Node* temp_head = head; Node* temp_tail = tail; size_t temp_size = size; head = rhs.head; tail = rhs.tail; size = rhs.size; rhs.head = temp_head; rhs.tail = temp_tail; rhs.size = temp_size; }
额外说明
把函数参数改成引用类型(dLinkedList& rhs)而非指针,是更符合C++风格的写法:
- 避免空指针风险,调用时直接传对象即可(比如
list1.swap(list2)),不需要取地址。 - 保证操作的是原对象而非副本,真正完成两个链表的状态交换。
内容的提问来源于stack exchange,提问作者SogaBan
相关产品推荐
相关产品推荐

