我一直在阅读使用类的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();
这是否意味着我在节点*中存储下一个地址?
注意:评论中回答了第二个问题。谢谢你的回复。
答案 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 对教科书有很多好的建议。