C++老鳥日記012 變量作用域

版權聲明

---------------------------------------------------------------------------------------------------------------------

該文章原創於Qter開源社區(www.qter.org

作者: 女兒叫老白 (白振勇)

轉載請註明出處!

---------------------------------------------------------------------------------------------------------------------

課程目錄:《C++老鳥日記》目錄

本套課程屬於:《C++跨平臺開發乾貨》系列課程。

----------------------------------------------------------------------------------------------------------------------

(3.5, 3.6)。

變量的作用域存在於離它最近的一對括號{}。C++中,我們可以在作用域的任意位置定義變量,比如在for循環中,但是一定要注意,變量的命名務必有含義,避免採用int i之類的定義。因爲在循環體中我們也可能會用int i。這樣就極有可能同循環體之外的int i產生混淆,導致代碼運行時出現我們期望之外的結果。

       全局變量是可以在一處定義,然後在其他cpp中也可使用的變量。全局變量定義於函數體之外,且不受作用域的影響,在程序的整個生命週期內都有效。使用extern聲明一個變量是全局變量。

       // a.cpp

       int g_ConfigCount = 0;

 

       // b.cpp
       extern int g_ConfigCount;

       如果我們在函數體之外定義一個變量x,但是又不希望在其他cpp中看到x,那麼就可以用靜態變量:

       // c.cpp

       static double s_Zero = 0.0001f;

       // d.cpp

       extern double s_Zero; // error! 編譯錯誤

 

       在函數體內部定義的static變量,表示該變量在內存中常駐且只初始化一次,變量生存期不受函數堆棧的影響。既然只初始化一次,那麼在變量定義時就必須初始化。

       // e.cpp

       int parseFile(const string& strFileName)

{

       static int s_successCount = 0;

       ……

       if (…) {

              s_successCount ++;

}     

}

但是全局變量或者靜態變量的初始化是跟編譯器相關的,不受編程人員的控制,有時候它的初始化可能出現意想不到的結果。我就碰到過文件作用域內的靜態變量初始化兩次的情況,這是有問題的,會導致程序出現不可預知的結果。因此如果使用 static定義文件作用域的靜態變量,請使用全局鎖進行保護(不能用類的成員鎖),比如:

       // f.cpp

       CMutex g_mtx;      // 全局鎖,不能用類的成員鎖。

      

       CMyClass& CMyClass ::getInstance() {

              g_mtx.lock();

              static CMyClass obj;

              return obj;

              g_mtx.unlock();

}

-------------------------------- 總結  --------------------------------------

1. 變量的作用域存在於離它最近的一對括號{}。

2. 變量命名要規範,避免使用i、j、k等名稱。循環體內外避免變量重名。

3. static變量可以用在文件作用域內,僅在某個文件內可見。

4. 全局變量初始化過程可能不可預測。

發佈了48 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章