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に設定されていることがわかります。しかし、2回目にd2-> f()を呼び出すと、コードは「static boolindicator=false;」という行にもヒットしません。そしてそれはtrueに保たれます(d1-f()の最初のパスから)これはまさに私が望む振る舞いですが、なぜこれが起こっているのか理解できません。誰かが何が起こっているのか説明してもらえますか?前もって感謝します

4

2 に答える 2

10

メンバー関数で宣言された静的変数は、関数呼び出し間でその値を保持しますすべてのインスタンスに対してコピーは1つだけでありindicator、異なるインスタンスからのすべてのアクセスは同じに影響しますindicator。これはindicator 、一度だけ初期化されることを意味します。

詳細については、こちらを参照してください:メンバー関数の静的変数

また、このコードはトグルしません。falseindicatorの場合は常にtrueに設定します(これはあなたが望む動作であると確信しています)。

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

これはまさに、関数ブロック内で宣言された静的変数の動作です。Cプログラミング言語でこの機能が導入されて以来、そのようになっています。

静的宣言は、内部変数にも適用できます。内部静的変数は、自動変数と同じように特定の関数に対してローカルですが、自動変数とは異なり、関数がアクティブ化されるたびに出入りするのではなく、存在し続けます。(K&R、61ページ)。

静的初期化子は、包含関数の最初の呼び出しの前に実行されます。静的であるため、変数は呼び出し全体で最後の状態を保持します。

于 2013-02-23T03:22:32.390 に答える