我有以下内容:
class base
{
public
void f();
...
}
void base::f()
{
static bool indicator=false;
.....
if(!indicator)
{
...
indicator=true;
}
}
class D:public base
{
...
}
在我的主要()中我有:
main()
{
// first instance of D
base *d1 = new D();
d1->f();
....
// 2nd instance of D
base *d2 = new D();
d2->f();
}
我发现第一次实例化D并调用d1-> f()时,静态变量设置为false。但是我第二次调用d2-> f()时代码甚至没有点击“静态bool指示器= false;”它保持为真(从d1-f()的第一遍开始)这正是我想要的行为,但我不明白为什么会这样。有人可以解释一下发生了什么。提前谢谢
答案 0 :(得分:10)
在成员函数中声明的静态变量将在函数调用之间保持其值。所有实例上只有一个副本,来自不同实例的indicator
的所有访问都会影响同一个indicator
。这意味着indicator
只会初始化一次。
有关详细信息,请参阅此处:Static variables in member functions
此代码也不会切换indicator
,如果它是假的,它总是将其设置为true(我确定这是你想要的行为)。
if(!indicator)
{
...
indicator=true;
}
答案 1 :(得分:4)
这正是在函数块内声明的静态变量的行为。自从C编程语言中引入该功能以来就是这样。
静态声明也可以应用于内部变量。内部静态变量对于特定函数是局部的,就像自动变量一样,但与自动变量不同,它们保持存在而不是每次激活函数时来来往往。 (K& R,第61页)。
静态初始化程序在第一次调用包含函数之前执行。作为静态变量,变量在调用中保留其最后一个状态。