关于c ++:基类成员函数内的静态变量

static variable inside member function of base class

我有以下几点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   class base
   {
      public
       void f();
       ...
   }
    void base::f()
    {
        static bool indicator=false;
         .....
         if(!indicator)
         {
            ...
            indicator=true;
          }
     }
    class D:public base
    {      
       ...
     }

在我的主()中,我有:

1
2
3
4
5
6
7
8
9
10
      main()
      {
          // first instance of D
          base *d1 = new D();
          d1->f();
           ....
           // 2nd instance of D
          base *d2 = new D();
          d2->f();
       }

我发现第一次实例化并调用d1->f()时,静态变量设置为false。但是第二次我调用d2->f()时,代码甚至没有碰到"static bool indicator=false"这一行;它保持为true(从d1-f()的第一次传递开始),这正是我想要的行为,但我不理解为什么会发生这种情况。有人能解释一下发生了什么事吗?提前谢谢


成员函数中声明的静态变量将在函数调用之间保留其值。所有实例上只有一个副本,不同实例对indicator的所有访问都会影响同一个indicator。这意味着indicator只初始化一次。

有关详细信息,请参见此处:成员函数中的静态变量

此外,此代码不会切换indicator,如果为false,它总是将其设置为true(我确信这是您想要的行为)。

1
2
3
4
5
if(!indicator)
     {
        ...
        indicator=true;
      }


这正是在函数块中声明的静态变量的行为。自从C语言引入这个特性以来,就一直是这样。

The static declaration can also be applied to internal variables. Internal static variables are local to a particular function just as automatic variables are, but unlike automatics, they remain in existence rather than coming and going each time the function is activated. (K&R, page 61).

静态初始值设定项在第一次调用包含函数之前执行。由于是静态的,变量在调用期间保持其最后状态。