引用可以替换指针吗?

Can references replace pointers?

本文关键字:指针 替换 引用      更新时间:2023-10-16

更具体地说,我想知道为什么我们在典型的链表实现中使用指针。节点的以下实现是否可能导致任何问题?

template <typename T>
class Node {
    T data;
    Node<T>& next;
    Node<T>& prev;
};

有什么理由我们应该在这里使用指针而不是引用吗?

创建引用后无法设置引用,这使得不可变的链接列表实现有些棘手。(您需要将引用包装在对象中,以便在要更改引用时重新装箱)。

也无法在引用上设置 NULL 值,因此表示列表的末尾需要一些想象力。

可能最好坚持使用链表中的指针,或者更好的是,使用 std::list<> .

Lvalue 引用不能替换指针;它们执行不同的事情。

左值引用必须使用左值初始化

,并且左值引用将在其剩余的生存期内引用该对象。它不能反弹。这会给列表节点带来两个直接问题。

你如何开始列表?您希望构造一个没有"上一个"的节点,但必须使用 Node 对象初始化prev成员。你可以想象使用一个Node,其prev是自己来表示列表的头部,但这正在解决左值引用的糟糕选择。(例如 Node<T> emptylist = { T(), emptylist, emptylist }; //eurgh

第二,你如何操纵名单?您无法更改nextprev的绑定,这意味着更改列表的唯一方法是构造一组全新的节点并复制每个data元素。