【发布时间】: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