【问题标题】:Difference between private static and private methods in a class类中私有静态方法和私有方法的区别
【发布时间】:2017-05-23 03:47:22
【问题描述】:

我正在学习我的导师设计的“通用树”课程,但无法理解某个概念。 里面有一个函数返回给用户,最高值的节点,下面是它的代码。

const Node<T> * getLargestNode() const {
    return getLargestNodeHelper(root);

}

我知道我们需要一个辅助函数,因为我们需要递归地执行它,因此需要一个参数。因此,需要一个辅助函数来将根作为参数传递,因为根不能作为主函数的参数传递,因为不需要访问内部数据成员。 下面是辅助函数的代码

private:
static const Node<T> * getLargestNodeHelper(const Node<T> * node) {
    if (node == NULL) {
        return NULL;
    }
    const Node<T> * largest = node;
    for (int i = 0; i < node->children.size();i++) {
        const Node<T> * childlargest = getLargestNodeHelper(node->children[i]);
        if (childlargest->data > largest->data) {
            largest = childlargest;
        }
    }
    return largest;
}

现在,当我尝试自己创建相同的类时,我创建了如下所示的辅助函数,

private:
 const Node<T> * getLargestNodeHelper(const Node<T> * node) const {
    if (node == NULL) {
        return NULL;
    }
    const Node<T> * largest = node;
    for (int i = 0; i < node->children.size();i++) {
        const Node<T> * childlargest = getLargestNodeHelper(node->children[i]);
        if (childlargest->data > largest->data) {
            largest = childlargest;
        }
    }
    return largest;
}

现在,我的疑问是,使用我的辅助函数版本有什么缺点吗?两者有什么区别,既不能改变数据成员,又不能从对象中调用?

【问题讨论】:

    标签: c++ static tree constants private


    【解决方案1】:

    如果您的方法不是静态的,则需要该类的对象才能调用它(即使它不关心您调用它的对象)。根据情况,这会产生创建虚拟对象并销毁它的开销,只需使用一次即可调用。
    静态方法可以在没有对象的情况下调用。

    【讨论】:

    • 但是由于两者都是私有的,所以不能从课堂外调用它们,对吧?那么这两者中哪一个实际上更好呢?
    • @AkshatGupta 在语义上是有意义的。如果它应该在实例上运行,请不要将其设为static。注意:您不需要实例来调用非静态成员,除非它是虚拟的:您可以通过将 0 转换为指向类的指针来做到这一点。
    【解决方案2】:

    在您的简单示例中,没有有用的区别,因为 getLargestNode() 始终需要一个对象。但在更复杂的类中,可能还有其他需要此类辅助函数的公共但静态成员函数。在这种情况下,您的函数无法被调用(代码未被重用)。另一件事是速度和内存(对于非常有限的系统)。带有指向对象的参数的参数可以在堆栈中占据一席之地(在某些系统中)。 getLargestNodeHelper() 被递归调用,所以更多的内存和更多的时间。
    这都是关于代码的重用。并且不要给递归函数超出它的要求。

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2010-11-04
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多