10

我一直在阅读使用类的 List(及其节点)的实现,并且发现了一些我不太了解的事情。这是我不明白的 Node 类中的代码:

    class Node {
      private:
         Data data;
         Node* next;
      public:
         Node*& getNext();
    };

    Node*& Node::getNext()
    {
       return this->next;
    }

*& 到底是什么?我不知道该方法返回了什么样的变量。

我想我现在明白了,稍后我有这些行(在类列表中):

Node** node = &first;
node = &(*node)->getNext();       

这是否意味着我将下一个地址存储在节点 * 中?

注意:评论中回答了第二个问题。感谢您的回复。

4

4 回答 4

9

那是对指针的引用。这意味着Node*函数返回的是一个别名Node::next

例如,假设您有:

Node n;
n.getNext() = NULL;

这设置n.nextNULL

如果方法没有通过引用返回

Node* Node::getNext()  //no reference
{
   return this->next;
}

相同的代码

Node n;
n.getNext() = NULL;

不会修改n.next- 在这种情况下,它将保持未初始化编译,因为这里getNext返回一个rvalue

或者,通过引用返回:

Node*& x = n.getNext();
x = new Node;

会修改n.next,因为x是对n.next.

于 2012-10-23T17:47:22.570 回答
4
Node*& getNext();

返回对 a 的引用Node*。为什么他们选择返回对指针的非常量引用,这允许函数的调用者更改它的值......我不知道。

于 2012-10-23T17:47:29.830 回答
4

这意味着您通过引用返回一个指针。这意味着有人可以修改节点内的实际指针:

Node anode = /* something... */;
anode.getNext() = nullptr;
assert(anode.getNext() == nullptr); // assertion passed!

这看起来不像您会使用它的情况。只需返回指针:

Node* Node::getNext()
{
   return next;
}
于 2012-10-23T17:47:55.330 回答
4

比较

class Node {
  private:
     Data data;
     Node* next;
  public:
     Node*& getNext();
};

Node*& Node::getNext()
{
   return this->next;
}

class Node {
  private:
     Data data;
  public:
     Node* next;
};

这些代码片段实现几乎相同,但后者是

  • 更短,

  • 更简单,并且

  • 也允许访问对象next上的指针const

因此,考虑到所有不必要的复杂性和限制,更不用说诸如Get前缀和使用之类的 Java 主义this->,您可以放心地假设您在该代码中看到的结构甚至命名很可能没有意义,甚至具有不利影响——正如该GetNext方法所具有的那样,限制了访问。

技术细节:&C++ 是否代表“引用”,C++ 引用的最基本解释是它是某个对象的别名。在 C++03 中,引用与它所引用的对象无法区分。无论 C++ 版本如何,在有效代码中都不存在空引用之类的东西。

要真正了解指针和引用,您应该使用一本好的C++ 教科书,而不是依赖网络论坛中的答案。

SO C++ FAQ book list对教科书有很多很好的建议。

于 2012-10-23T17:57:54.317 回答