2014-01-17 50 views
1

關於const關鍵字在C++中的使用的另一個問題(我是C++的新手,試圖在SO上找到答案 - 答案太多,但未能找到答案)。
問題1:在下面的成員函數const成員函數如何更改對象的數據?

template <class T> 
bool BinTree<T>::insert(Node<T>* & node, const T& val) const 
{ 
    node = new Node<T>(val); 
} 

我能夠改變其作爲參考通過一個類的數據。成員函數const怎麼樣?是否真的這const阻止數據只顯式更改,但允許通過引用更改它?
2.你能確認我的理解:

func(const Node<T>* const & node) {...} 

在此函數中的簽名的2-ND const裝置常量指針和1-ST const裝置const的節點(從而該節點是常量指針爲const一個參考節點)?

+0

下面通過@tabstop進行了確認。第一個呢?我沒有發佈整個代碼,因爲它很明顯:有一個對象的字段作爲參考傳遞給const成員並在那裏更改! –

+0

parashift.com/c++-faq/const-member-fns.html –

+1

「(所以節點是對const Node的const指針的引用)」是的,但參考方面不太可能有任何有用的影響,因爲傳遞對「const指針」的引用可能會採用與通過值傳遞const指針相同數量的寄存器/字節堆棧。 –

回答

1

成員函數是const意味着,就函數而言,this對象(BinTree<T>)是const。 (當然val是const,因爲它被標記爲這樣。)(編輯:這有點令人驚訝,因爲insert聽起來不像你對const樹所做的那種功能,因爲你無法更新任何內部數據結構)。

你的函數簽名是正確的 - 第一個意思是「指向的東西」是const,第二個意思是指針本身是const。


EDIT基礎上,進一步的討論在註釋: 函數考慮this對象爲常量,並且node成爲非const。因此,您不能直接更改任何成員變量。 然而,如果node恰好是對的this成員的引用(說這是通過

foo.insert(foo.root); 

那麼特定成員變量是可以改變的,但僅通過別名的node調用。編譯器甚至不會注意到兩個對象thisnode是相關的,因爲當它正在查看函數insert時,它們不是(僅在實際發生調用時纔會發生別名)const僅適用於(文字,我f表示)this;任何其他的指針或引用都可以做他們想做的事情。

+0

你對'insert'函數是正確的,我只是在玩,認爲我會在const成員中得到'node = ...'的錯誤。所以我的第一個問題是爲什麼它起作用? Const成員函數更改了'this'的數據。 –

+0

我不知道你的意思是「改變了這個數據」。您更改了'node',它是傳入的參數。您在'this'對象中沒有任何更改。 – tabstop

+0

這就是要點:我將根作爲'node'傳遞並改變了它的值。我錯過了什麼? 編輯:避免誤解,我有具有私有字段'root'我通過根成const成員函數作爲參考,併成功地改變了'root'值的二叉樹對象。 –