c++ - const成员函数如何改变对象的数据?

标签 c++ constants

还有一个关于 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 的别名 。编译器甚至不会注意到这两个对象 thisnode是相关的,因为当时它正在查看函数 insert它们不是(只有当调用实际发生时才会发生别名)。 const仅适用于(字面意思,如果隐含)this ;任何其他指针或引用都可以做他们想做的事。

关于c++ - const成员函数如何改变对象的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176836/

相关文章:

c++ - 在 OpenCL 中实现

c++ - 如何通过在OnEraseBkgnd()中使用StretchBlt制作缩小位图的动画并摆脱其周围的 “shadow”? (MFC)

C++ 中的 C# 只读(与 const 的细微差别)

javascript - 如果我使用 const,为什么 JSHint 会发出警告?

C++ 2440 错误 - 编译器认为字符串是 const char?

数组的 C++ 语法指针

c++ - Hook 内部函数 : How do the the parameters look like?

c++ - 获取名称子组

c++ - 忽略大小模板的 std::array::iterator

linq-to-sql - 具有常量值和投影的 Union(或 Concat 等)