我可以将递归函数的返回值设置为const吗?

时间:2013-04-24 01:24:34

标签: c++ recursion const return-value

我正在用c ++编写一个二叉树(使用链接节点表示)。 我想编写一个成员函数来计算树中节点的数量,所以我写了一个递归函数来完成这项工作:

template<class Item> size_t binary_tree<Item>::count_node(
                                binary_tree_node<Item>* const node)
{
    if(node == NULL) return 0;
    else return 1 + count_node(node->get_left())
                  + count_node(node->get_right());
}

我在binary_tree类的private中设置了这个函数。我有一个公共函数size()来调用它:

template<class Item> size_t binary_tree<Item>::size()
{
    return count_node(root);
}

现在我的问题出现了:如果我像编写代码一样编写size(),它可以正常工作。但是如果我像这样将返回值设置为const:

template<class Item> size_t binary_tree<Item>::size() const
{
    return count_node(root);
}

此代码无法编译。编译器抱怨无法将size_t传递给const size_t。如何解决这个问题?感谢。

1 个答案:

答案 0 :(得分:4)

const方法内部调用的任何方法都需要const。因此,在您的情况下,count_node类也需要标记为const

更正式地说,当你进入标记为const的函数时,this指针变为const T*,因此你不能调用任何不使用它的方法也接受const T*,因为那时您必须将const T*投射到T*,这是不允许的。如果你真的想做一些非常量的事情,你可以使用const_cast删除常量(不推荐),或者使用volatile成员/方法。