关于{+ 1}} 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 ) {...}
表示const指针,1-st const
表示const节点(因此该节点是对const节点的const指针的引用)?
答案 0 :(得分:2)
成员函数是const意味着,就函数而言,this
对象(BinTree<T>
)是const。 (当然val
是const,因为它被标记为。)(编辑:这有点令人惊讶,因为insert
听起来不像你对{{1}所做的那种功能树,因为您无法更新任何内部数据结构。)
你的函数签名是正确的 - 第一个意思是“指向的东西”是const,第二个意味着指针本身就是const。
编辑基于评论中的进一步讨论:
该函数将const
对象视为const,将this
视为非const。因此,您无法直接更改任何成员变量。 但是,如果node
恰好是对node
成员的引用(比如说是通过
this
然后可以更改特定的成员变量,但仅通过foo.insert(foo.root);
的别名。编译器甚至不会注意到两个对象node
和this
是相关的,因为当它正在查看函数node
时它们不是(只有在调用时)实际发生的是混叠发生)。 insert
仅适用于{literal,如果隐含的话} const
;任何其他指针或引用都可以做到他们想要的。