![](/img/trans.png)
[英]undefined reference to `Static Class Member variable inside Static member function'
[英]static variable inside member function of base class
我有以下内容:
class base
{
public
void f();
...
}
void base::f()
{
static bool indicator=false;
.....
if(!indicator)
{
...
indicator=true;
}
}
class D:public base
{
...
}
在我的main()中,我有:
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()时,代码甚至都没有碰到“ static bool indicator = false;”这一行。 并且它保持真实(从d1-f()的第一遍开始)这正是我想要的行为,但是我不明白为什么会这样。 有人可以解释发生了什么吗? 提前致谢
在成员函数中声明的静态变量将在函数调用之间保留其值 。 所有实例将只有一个副本 ,并且来自不同实例的所有对indicator
访问将影响同一indicator
。 这意味着indicator
将只初始化一次 。
有关更多信息,请参见此处: 成员函数中的静态变量
同样,此代码也不会切换indicator
,如果它为假,它总是将其设置为true(我确定这是您想要的行为)。
if(!indicator)
{
...
indicator=true;
}
这恰好是在功能块内部声明的静态变量的行为。 自从在C编程语言中引入该功能以来,就一直如此。
静态声明也可以应用于内部变量。 就像自动变量一样,内部静态变量在特定函数中是局部的,但是与自动变量不同,内部静态变量仍然存在,而不是每次激活该函数时都会出现。 (K&R,第61页)。
静态初始化程序在包含函数的第一次调用之前执行。 由于是静态变量,因此变量在调用中将保留其最后一个状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.