1

我有以下内容:

   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() 代码甚至没有命中“静态布尔指标=假”行 并且它保持为真(从 d1-f() 的第一遍开始)这正是我想要的行为,但我不明白为什么会这样。有人可以解释发生了什么。提前致谢

4

2 回答 2

10

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

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

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

if(!indicator)
     {
        ...
        indicator=true;
      }
于 2013-02-23T03:22:39.340 回答
3

这正是在功能块内声明的静态变量的行为。自从在 C 编程语言中引入该功能以来,情况就是如此。

静态声明也可以应用于内部变量。内部静态变量对于特定函数是局部的,就像自动变量一样,但与自动变量不同的是,它们仍然存在,而不是在每次激活函数时来来去去。(K&R,第 61 页)。

静态初始化程序在第一次调用包含函数之前执行。作为静态变量,变量在调用过程中保持其最后状态。

于 2013-02-23T03:22:32.390 回答