【问题标题】:static variable inside member function of base class基类成员函数内的静态变量
【发布时间】:2013-02-08 19:20:36
【问题描述】:

我有以下几点:

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

【问题讨论】:

  • 按照设计,初始化程序只对函数中的静态变量运行一次。如果您不想要这种行为,那么您只需将变量声明为非静态。重点是通过多次调用函数来保持值。

标签: c++ inheritance static


【解决方案1】:

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

查看这里了解更多信息:Static variables in member functions

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

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

【讨论】:

  • 不是你的错,但是你链接的问题的标题有点混乱,因为“类方法”可以理解为引用静态方法。
  • @user463035818 是的,同意。正确的 C++ 术语是“成员函数”。我已经更新了引用问题中的标题。
【解决方案2】:

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

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

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

【讨论】:

  • 根据stackoverflow.com/a/35251486/3758484,这个答案是不正确的,因为它是关于C语言的,这是一个C++问题。
  • @johnbakers 你是对的,C++ 的编译时常量要求已经取消。谢谢!
猜你喜欢
  • 2012-12-20
  • 2011-09-07
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多