基类成员函数内的静态变量

时间:2013-02-23 03:14:55

标签: c++ inheritance static

我有以下内容:

   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()的第一遍开始)这正是我想要的行为,但我不明白为什么会这样。有人可以解释一下发生了什么。提前谢谢

2 个答案:

答案 0 :(得分:10)

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

有关详细信息,请参阅此处:Static variables in member functions

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

if(!indicator)
     {
        ...
        indicator=true;
      }

答案 1 :(得分:4)

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

  

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

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