C++靜態數據的初始化

in$ cat static.cpp 
#include <iostream>  
using namespace std;  
class ClassA {  
public:  
ClassA() {  
        cout << "ClassA Constructor!" << endl;  
    }  
void Func() {  
      cout << "ClassA Func() Called! Num:" << m_nNum << endl;  
}  
int m_nNum;  
};  
class ClassB {  
public:  
    ClassB() {  
       cout << "ClassB Constructor! " << endl;  
      s_A.Func();  
}  


protected:  
     static ClassA s_A;  
};  




ClassB TestClass;                      //在初始化B內的靜態成員之前就先定義了這個對象
ClassA ClassB::s_A;  


int main(int argc, char *argv[])  
{  
   system( "PAUSE ");  
  return 0;  
}

對於C語言的全局和靜態變量,不管是否被初始化,其內存空間都是全局的;如果初始化,那麼初始化發生在任何代碼執行之前,屬於編譯期初始化。由於內置變量無須資源釋放操作,僅需要回收內存空間,因此程序結束後全局內存空間被一起回收,不存在變量依賴問題,沒有任何代碼會再被執行!

 

C++引入了對象,這給全局變量的管理帶領新的麻煩。C++的對象必須有構造函數生成,並最終執行析構操作。由於構造和析構並非分配內存那麼簡單,可以說相當複雜,因此何時執行全局或靜態對象(C++)的構造和析構呢?這需要執行相關代碼,無法在編譯期完成,因此C++標準規定:全局或靜態對象當且僅當對象首次用到時才進行構造,並通過atexit()來管理對象的生命期,在程序結束之後(如調用exit,main),按FILO順序調用相應的析構操作!

 

總結:

 

全局變量、文件域的靜態變量和類的靜態成員變量在main執行之前的靜態初始化過程中分配內存並初始化;局部靜態變量(一般爲函數內的靜態變量)在第一次使用時分配內存並初始化。這裏的變量包含內置數據類型和自定義類型的對象。

*/

局部靜態變量:

(1)該變量在全局數據區分配內存;

(2)靜態局部變量在程序執行到該對象的聲明處時被首次初始化,即以後的函數調用不再進行初始化;

(3)靜態局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化爲0;

(4)它始終駐留在全局數據區,直到程序運行結束。但其作用域爲局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章