2013-02-23 288 views
1

我有以下靜態變量

 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()代碼甚至沒有命中「static bool indicator = false;」並且它保持爲真(從d1-f()的第一遍),這正是我想要的行爲,但我不明白爲什麼會發生這種情況。有人可以請解釋發生了什麼。在此先感謝

+0

通過設計,初始值設定項對函數中的靜態變量只運行一次。如果你不想要這種行爲,那麼你只需將該變量聲明爲非靜態的。重點是通過多次調用該函數來維護該值。 – Lou 2013-02-23 03:21:41

回答

8

在成員函數中聲明的靜態變量會在函數調用之間保持它們的值。在所有實例中將只有一個副本,並且來自不同實例的對indicator的所有訪問將影響相同的indicator。這意味着indicator只會被初始化

這裏看到更多的信息:Static variables in class methods

另外這個代碼不切換indicator,如果它是假的總是設置爲true(我敢肯定是你想要的行爲)。

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

這正是在功能塊內聲明的靜態變量的行爲。從C編程語言中引入該功能以來一直如此。

靜態聲明也可以應用於內部變量。與自動變量一樣,內部靜態變量對於特定函數是局部的,但與自動變量不同,它們保持存在,而不是每次激活該函數時進出。 (K & R,第61頁)。

靜態初始化器在第一次調用contains函數之前執行。作爲靜態變量,變量保留其在調用中的最後狀態。

+1

根據http://stackoverflow.com/a/35251486/3758484,這個答案是不正確的,因爲它是關於C語言,這是一個C++問題。 – johnbakers 2016-02-07 08:55:57

+0

@johnbakers你是對的,編譯時常量要求已經取消了C++。謝謝! – dasblinkenlight 2016-02-07 10:19:27