让我们说我有一个定期调用的函数。该函数获取一个值作为参数,我想将它与早期函数调用期间收到的值进行比较,即。价值需要记住。我应该为此目的使用静态非成员变量还是非静态成员变量?这两种方法的优点和缺点是什么?
作为静态非成员方法,我的意思是
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;
};
};
答案 0 :(得分:3)
首先,您应该添加一些非static
lastValue_
成员变量的初始化 - 就像您有未定义的行为一样。 (static
函数局部变量将初始化为0
,这可能适合您,也可能不适合您。)
这两种方法有哪些优点和缺点?
使用非静态成员变量意味着程序可以根据需要创建尽可能多的foo
个实例,并且它们可以独立运行。没有两个线程应该在没有同步的情况下访问相同的foo
对象,但是它们可以访问其他线程无法访问的foo
个实例,包括任何特定于线程的foo
实例。
拥有一个非静态成员变量也可以使单元和回归测试变得更容易,因为简单地创建一个新对象将会重置"重置"状态,而使用static
函数局部变量,没有简单的方法来恢复起始值(你必须破解一个请求它的函数参数)。
函数本地static
变量确实具有在其他代码可访问性方面更加本地化的优势,明确表示它仅与func
相关功能。通常需要使用尽可能最小的可变范围,但这里的重要性远远低于上述几点。
更一般地说 - 在很多方面,函数本地static
变量与全局变量或单例具有相同的问题 - 谷歌会非常巧妙地改变它们。