2012-10-23 144 views
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();  

这是否意味着我在未来存储的地址在节点*?

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

+1

这是对指针的引用。 –

+1

当你认为返回一个引用可能是一个好主意时,你应该总是提出两个问题:1)这个东西是否被'Node'的用户实际拥有? 2)引用是否永远不会超过它所指的对象?如果两个答案都是肯定的,通常只考虑返回一个参考。 –

+2

这不是一个操作员。 – Puppy

回答

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,如xn.next参考。

+0

-1'n.getNext()= NULL;'Node * Node :: getNext()'不会编译。你不能分配给右值。 –

+0

@ Cheersandhth.-Alf真,好点,得到了带走:) –

+0

他他。好。删除downvote。 –

4
Node*& getNext(); 

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

4

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

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

这看起来并不像你想要的那样。只返回指针:

Node* Node::getNext() 
{ 
    return next; 
} 
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对象上。

因此,考虑所有的不必要的复杂性和局限性,更何况Java的ISMS如Get前缀和使用this->,你可以安全地假设,构造,甚至命名,你在代码中看到,最有可能的是没有意义,,甚至有不利影响–方法肯定有限制访问。

技术详细信息:&是C++代表“参考”,对C++参考的最基本解释是对于某些对象,它是一个别名。在C++ 03中,引用与它提到的对象无法区分。不管C++版本如何,在有效代码中都不存在空引用。

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

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

+0

我会downvote,但后来我意识到通过引用返回也打破封装,所以+1。 –