常量成员函数如何更改对象';谁的数据? >关于C++中的代码> const 关键字用法(我是C++初学者,试图找到答案,答案太多,但找不到答案)。 问题1:在以下成员职能中 template <class T> bool BinTree<T>::insert( Node<T>* & node, const T& val ) const { node = new Node<T>(val); }

常量成员函数如何更改对象';谁的数据? >关于C++中的代码> const 关键字用法(我是C++初学者,试图找到答案,答案太多,但找不到答案)。 问题1:在以下成员职能中 template <class T> bool BinTree<T>::insert( Node<T>* & node, const T& val ) const { node = new Node<T>(val); },c++,constants,C++,Constants,在该函数签名中,第二个const表示const指针,第一个const表示const节点(因此该节点是指向const节点的const指针的引用)?成员函数为const意味着,就函数而言,此对象(BinTree)为const。(当然,val是常量,因为它被标记为常量。)(编辑:这有点令人惊讶,因为insert听起来不像对const树所做的那种函数,因为您无法更新任何内部数据结构。) 您的函数签名是正确的——第一个表示“指向的对象”是常量,第二个表示指针本身是常量 根据评论中的进一步讨论进行编辑:

在该函数签名中,第二个
const
表示const指针,第一个
const
表示const节点(因此该节点是指向const节点的const指针的引用)?

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

您的函数签名是正确的——第一个表示“指向的对象”是常量,第二个表示指针本身是常量


根据评论中的进一步讨论进行编辑: 该函数将
对象视为常量,将
节点
视为非常量。因此,您不能直接更改任何成员变量。但是,如果
节点
恰好是对
的成员的引用(假设它是通过

foo.insert(foo.root);

然后可以更改特定的成员变量,但只能通过
节点
的别名进行更改。编译器甚至不会注意到这两个对象
this
节点
是相关的,因为在查看函数
insert
时,它们不是相关的(仅当调用实际发生时才会出现别名)。
const
仅适用于(如果隐含,则为文字)
这个
;任何其他指针或引用都可以执行它们想要的操作。

你对
插入
函数的看法是正确的,我只是在玩,我想我会在const成员中的
节点=…
中得到一个错误。所以我的第一个问题是它为什么工作?const成员函数更改了
这个
的数据。我没有知道你所说的“更改了
的数据”是什么意思吗。您更改了
节点
,这是传入的参数。您根本没有更改
对象中的任何内容。这就是问题所在:我将根作为
节点
传递,并更改了其值。我缺少了什么?编辑:为了避免误解,我有一个BinTree对象,它有一个私有字段
将root into const成员函数作为引用,并成功地更改了
root
值。@如果您当时将该方面添加到问题中,这会有所帮助。但本质上,const仅适用于编译器在该函数的上下文中可以看到的内容。它不知道节点参数来自何处(毕竟它可能完全是其他对象的节点)因此函数级常量不适用于它。似乎证实了您的说法(我在问题中怀疑:“……此常量仅阻止数据显式更改,但允许通过引用更改数据”)。第二个由下面的@tabstop确认。第一个呢?我没有发布完整的代码,因为它非常明显:有一个对象的字段作为引用传递到const成员并在那里更改!parashift.com/c++-faq/const member fns.html”(因此该节点是指向const节点的const指针的引用)是的,但引用方面不太可能有任何有用的影响,因为将引用传递给
常量指针
可能需要与按值传递常量指针相同数量的寄存器/堆栈字节。您在注释中说,在调用“insert”时,将指针作为“node”参数传递给根节点:您似乎不是在摸索“封装”或“常量”…您通常希望将数据插入到树中,其中只有树对象本身需要关心哪个节点是根,即节点是“私有的”数据成员。
insert
函数应该是非常量的,这样它就可以修改
。按原样,您的函数可以是
静态
,而不是
常量
,因为它不会基于对对象实例的隐式访问(即通过
)修改任何内容.@Tony D同意。正如我在评论中所说的,我在和const member玩游戏,期待着一个错误。令我惊讶的是,在这个案例中没有错误。下面的评论似乎可以解释这一点。
foo.insert(foo.root);