最近一位同事向我展示了这样的代码:
void SomeClass::function()
{
static bool init = false;
if (!init)
{
// hundreds of lines of ugly code
}
init = true;
}
他想检查是否SomeClass
已初始化,以便每个Someclass
实例执行一次代码,但事实是SomeClass
在程序的整个生命周期中只存在一个实例。
他的问题是关于init
静态变量,关于它的初始化时间。我已经回答说初始化发生一次,因此该值将false
在第一次调用和true
其生命周期的其余时间。回答后,我补充说这样使用静态变量是不好的做法,但我无法解释原因。
到目前为止,我一直在考虑的原因如下:
static bool init
into的行为SomeClass::function
可以通过非静态成员变量来实现。- 中的其他函数
SomeClass
无法检查该static bool init
值,因为它的可见性仅限于void SomeClass::function()
范围。 - 静态变量不是OOPish,因为它们定义了全局状态而不是对象状态。
这个原因对我来说看起来很糟糕,不聪明而且不是很具体,所以我要求更多的理由来解释为什么在函数和成员函数空间中使用静态变量是一种不好的做法。
谢谢!