【发布时间】:2014-01-17 02:34:07
【问题描述】:
还有一个关于 C++ 中 const 关键字用法的问题(我是 C++ 新手,试图在 SO 上找到答案 - 答案太多但找不到答案)。
问题1:在下面的成员函数中
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 个 const 表示 const 指针,第 1 个 const 表示 const Node(因此该节点是对 const 指针的引用,指向 const Node)?
【问题讨论】:
-
第二次由下面的@tabstop 确认。第一个呢?我没有发布整个代码,因为它很明显:有一个对象的字段作为引用传递给 const 成员并在那里更改!
-
parashift.com/c++-faq/const-member-fns.html
-
"(所以该节点是对 const 指向 const 节点的指针的引用)" 是的,但是引用方面不太可能产生任何有用的影响,因为传递对
const pointer的引用可能需要与按值传递 const 指针相同的寄存器/堆栈字节数。 -
你在 cmets 中说你在调用“insert”时将指向根节点的指针作为“node”参数传递:你似乎没有在“封装”或“const”...您通常希望将数据插入树中,其中只有树对象本身需要关心哪个节点是根,即节点是“私有”数据成员。
insert函数应该是非常量的,因此它可以修改root。照原样,您的函数可能是static而不是const,因为它不会根据对对象实例的隐式访问(即通过this)修改任何内容。 -
@Tony D 同意。正如我在 cmets 中所说,我在玩 const 成员并期待一个错误。令我惊讶的是,在这种情况下没有错误。下面的 cmets 似乎可以解释这一点。