1. 程式人生 > >C/C++全域性變數和區域性變數作用域問題

C/C++全域性變數和區域性變數作用域問題


  這是一個作用域的問題。一個宣告將一個名字引進一個作用域;區域性變數(通常在函式中定義)的作用域是從宣告的那一點開始,直到這個宣告所在的塊結束為止(一個塊就是由{}圍起來的一段程式碼)。全域性變數(在所有函式、類、名稱空間之外定義)的作用域從宣告的那一點開始,直到這個宣告所在的檔案的結束。與全域性變數重名的區域性變數可以遮蔽全域性變數,如果想在塊內使用全域性變數需要通過作用域解析運算子::引用。 見下例: //global_local.cpp
#include <iostream>
using namespace std;
int x ;   //定義一個全域性變數x
int main()
{
    int x ; //遮蔽全域性變數x
    cout<< "Global x Initial value = "<< ::x<< endl;
    cout<< "Local x Initial value = "<< x<< endl;
    x = 5;          //對區域性變數x賦值
    ::x = 6;      //通過作用域解析運算子::引用全域性變數x,並且改變其值
    cout<< " After assignment Global x = " << ::x<< endl;
    cout<< "After assignment Local x = " << x <<endl;
    return 0;
}
上述例子輸出結果為:
Global x Initial value = 0
Local x Initial value = 11239412
After assignment Global x = 6
After assignment Local x = 5
從上面的例子還可以看出,如果沒有顯示初始化,那麼全域性變數、靜態區域性變數等靜態物件會被自動初始化為適當型別的0,而區域性物件(也稱為自動物件)和在自由儲存區裡建立的物件(動態物件或者堆物件)將不會被初始化。