Const函数最终通过友元类修改自身
Const function eventually modifies itself through friend class
在我的实现中,我有一个包含许多Node
的主类Tree
。每个Node
包含一个指向下一个Node
的指针,如果不实现则可以为NULL。Tree
跟踪节点总数
通过Tree
实现了一个返回Node
指针的搜索函数。但是,如果Node
还不存在,则创建一个新节点。这将增加Tree::m_totalnodes
变量。然而,Tree::GetNode
是const,但是这个修改没有提供任何警告、错误或运行时失败。这是什么原因(可能与tbNode::m_tree
是非const有关)?
class Node; //forward declare
class Tree {
public:
Tree() : m_totalnodes(0) {
m_firstnode = new Node(this,0);
}
Node* GetNode(int nodenumber) const { //note const! Should not modify Tree
return m_firstnode->FindNode(nodenumber); //this function eventually modifies it (and no warning)
}
private:
friend class Node;
unsigned int m_totalnodes;
Node* m_firstnode;
};
class Node {
public:
Node(Tree *thetree, int nodenumber) : m_tree(thetree), m_nextnode(NULL), m_nodenumber(nodenumber) {
m_tree->m_totalnodes++;
}
Node* FindNode(int nodenumber) {
if (!m_nextnode)
m_nextnode = new Node(m_tree, nodenumber);
return m_nextnode;
}
private:
Tree* m_tree;
Node* m_nextnode;
unsigned int m_nodenumber;
};
Node* m_firstnode;
当您调用GetNode
这样的const
方法时,this
将成为具有const资格的Tree const *
类型。当您访问像m_totalnodes
这样的成员时,它们看起来像unsigned int const
一样是const限定的。不能修改对象。m_firstnode
变成了Node * const
:你不能修改指针,但是你仍然可以修改它指向的Node
。
如果想全面避免意外修改,可以通过重载getter函数访问m_firstnode
:
Node * & firstnode() { return m_firstnode; }
Node const * firstnode() const { return m_firstnode; }
(其他访问器样式也是可能的,这只是一个例子。但请注意,我不认为从第二个访问器返回Node const * const &
是安全的;这可以编译,但它会返回一个对临时对象的引用。)
非const成员将调用第一个方法,并将看到一个指向可修改Node
的可修改指针。const限定的成员将调用第二种方法,并将两者都视为不可修改的。
const只承诺方法本身不会改变数据成员。它没有说明Node对象不能更改数据成员(Node可以更改数据成员,因为它是友元)。
相关文章:
- C++模板来检查友元函数的存在
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 如何在嵌套类中正确使用友元声明?
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 将子类方法声明为基类的友元
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 友元方法作为常量
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 未定义的类模板不会实例化以检查友元函数
- C++:成员不可访问-使用友元函数允许一个类修改另一个类的成员数据
- Const函数最终通过友元类修改自身