2012-10-23 138 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。 –