在C ++

时间:2016-02-10 10:56:52

标签: c++ class static member

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

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

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;
        };
};

1 个答案:

答案 0 :(得分:3)

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

  

这两种方法有哪些优点和缺点?

  • 使用非静态成员变量意味着程序可以根据需要创建尽可能多的foo个实例,并且它们可以独立运行。没有两个线程应该在没有同步的情况下访问相同的foo对象,但是它们可以访问其他线程无法访问的foo个实例,包括任何特定于线程的foo实例。

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

  • 函数本地static变量确实具有在其他代码可访问性方面更加本地化的优势,明确表示它仅与func相关功能。通常需要使用尽可能最小的可变范围,但这里的重要性远远低于上述几点。

  • 更一般地说 - 在很多方面,函数本地static变量与全局变量或单例具有相同的问题 - 谷歌会非常巧妙地改变它们。