【问题标题】:Using static non-member vs. non-static member variables in C++在 C++ 中使用静态非成员与非静态成员变量
【发布时间】:2016-05-20 16:34:19
【问题描述】:

假设我有一个定期调用的函数。该函数获取一个值作为参数,我想将它与之前函数调用期间收到的值进行比较,即。该值需要被记住。我应该为此使用静态非成员变量还是非静态成员变量?这两种方法的优缺点是什么?

作为静态非成员方法,我的意思是

class foo {
    public:
        void func(int value) {
            static int lastValue;
            if (value > lastValue) {
                doSomething(value)
            }
            lastValue = value;
    };
};

作为非静态成员变量,类似于

class foo {
    private:
        int lastValue_;

    public:
        void func(int value) {
             if (value > lastValue_) {
                 doSomething(value)
             }
             lastValue_ = value;
        };
};

【问题讨论】:

  • 如果lastValue仅用于函数我认为使用静态方法是合理的
  • 是的,在这种情况下它只用于单个函数。
  • @AlexeyAndronov 在这种情况下,class foo 的所有实例将通过func() 共享相同的lastValue。而对于非静态成员变量,每个实例都有自己的记忆。这里可能需要也可能不需要,但这是一个非常重要的区别。
  • @underscore_d 所以只有当foo 的单个实例存在时才可以安全使用?那样的话,应该是单例吗?
  • 让多个实例访问一个共享变量绝不是“不安全的”,这是static 成员为您提供的网络。相反,如果“安全”是指您想要限制对单个实例的访问,那么是的,单例或某些变体将确保这一点。然而,同样地,在实践中,单例模式有点违背了将成员 statics 用于除 get_instance() 之外的任何内容的意义:P

标签: c++ class static member


【解决方案1】:

首先,您应该添加一些非static lastValue_ 成员变量的初始化 - 因为您有未定义的行为。 (static 函数局部变量将初始化为 0,这可能适合您,也可能不适合您。)

这两种方法的优缺点是什么?

  • 使用非静态成员变量意味着程序可以创建任意数量的foo 实例,并且它们将独立运行。没有两个线程应该在没有同步的情况下访问同一个 foo 对象,但它们可以访问其他线程没有访问的 foo 实例,包括任何线程特定的 foo 实例。

  • 拥有一个非静态成员变量还可以使单元测试和回归测试更容易,因为简单地创建一个新对象将“重置”状态,而使用 static 函数局部变量没有简单的方法来恢复起始值(你必须破解一个请求它的函数参数)。

  • 1234563使用尽可能紧凑的变量范围通常是可取的,但在这里,这远不如上述几点重要。
  • 更一般地说 - 在许多方面,函数局部 static 变量与全局变量或单例具有相同的问题 - google 会非常巧妙地解决这些问题。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多