还有一个关于 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 ) {...}
在此函数签名中,第二个 const
表示 const 指针,第一个 const
表示 const Node(因此该节点是对 const 指针的引用)节点)?
最佳答案
成员函数是 const 意味着,就该函数而言,this
对象( BinTree<T>
)是 const。 (当然 val
是 const,因为它被标记为 const。)(编辑:这有点令人惊讶,因为 insert
听起来不像您对 const
树执行的那种功能,就像您所做的那样无法更新任何内部数据结构。)
你的函数签名是正确的——第一个意味着“指向的东西”是const,第二个意味着指针本身是const。
根据评论中的进一步讨论进行编辑:
该函数考虑 this
对象是 const,并且 node
是非常数。因此,您不能直接更改任何成员变量。 但是,如果 node
恰好是对 this
成员的引用(假设它是通过调用的
foo.insert(foo.root);
那么可以更改特定成员变量,但只能通过 node
的别名 。编译器甚至不会注意到这两个对象 this
和node
是相关的,因为当时它正在查看函数 insert
它们不是(只有当调用实际发生时才会发生别名)。 const
仅适用于(字面意思,如果隐含)this
;任何其他指针或引用都可以做他们想做的事。
关于c++ - const成员函数如何改变对象的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176836/