结合&和*运营商

时间:2012-10-23 17:46:24

标签: c++ class reference linked-list operators

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

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

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

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

我想我现在得到它,后来我有这些行(在类List中):

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

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

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

4 个答案:

答案 0 :(得分:9)

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

例如,假设你有:

Node n;
n.getNext() = NULL;

这会将n.next设置为NULL

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

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的引用。

答案 1 :(得分:4)

Node*& getNext();

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

答案 2 :(得分:4)

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

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

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

Node* Node::getNext()
{
   return next;
}

答案 3 :(得分: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前缀和this->之类的Java主义,您可以安全地假设构造甚至命名为您在该代码中看到,很可能没有意义,甚至有不利影响 - 正如GetNext方法所规定的那样,限制了访问。

技术细节:&是C ++代表“参考”,而C ++参考的最基本解释是它对某些对象是别名。在C ++ 03中,引用与它所引用的对象无法区分。无论是C ++版本,在有效代码中都没有空引用。

要真正了解指针和参考资料,您应该使用优秀的 C ++教科书,而不是依赖网络论坛中的答案。

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