const成员函数如何更改对象的数据?

时间:2014-01-17 02:34:07

标签: c++ const

关于{+ 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指针的引用)?

1 个答案:

答案 0 :(得分:2)

成员函数是const意味着,就函数而言,this对象(BinTree<T>)是const。 (当然val是const,因为它被标记为。)(编辑:这有点令人惊讶,因为insert听起来不像你对{{1}所做的那种功能树,因为您无法更新任何内部数据结构。)

你的函数签名是正确的 - 第一个意思是“指向的东西”是const,第二个意味着指针本身就是const。


编辑基于评论中的进一步讨论: 该函数将const对象视为const,将this视为非const。因此,您无法直接更改任何成员变量。 但是,如果node恰好是对node成员的引用(比如说是通过

调用的话)
this

然后可以更改特定的成员变量,但仅通过foo.insert(foo.root); 的别名。编译器甚至不会注意到两个对象nodethis是相关的,因为当它正在查看函数node时它们不是(只有在调用时)实际发生的是混叠发生)。 insert仅适用于{literal,如果隐含的话} const;任何其他指针或引用都可以做到他们想要的。