寫在前面:
1.C++中的全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變量定義的源文件需要用extern 關鍵字再次聲明這個全局變量。
2.C++中,在函數或一個代碼塊內部聲明的變量,稱為局部變量。它們只能被函數內部或者代碼塊內部的語句使用。當局部變量被定義時,系統不會對其初始化,必須自行對其初始化。
在程序中,局部變量和全局變量的名稱可以相同。但是在函數內的局部變量與全局變量是兩個獨立的變量,互不影響,全局變量的值可以在局部函數內重新賦值。
注:全局變量從定義處開始至程序結束起作用,即全局變量存在有效作用域。
#include<iostream>
using namespace std; int main() { cout<<"a= "<<a<<endl; //編譯不通過,a是未知字符
return 0; } int a=10; //全局變量從此處定義
若要想讓 main 函數也使用全局變量 a,可以用 extern 對全局變量進行聲明,就可以合法使用了。
#include<iostream>
using namespace std; int main() { extern int a; cout<<"a= "<<a<<endl; //合法,輸出10
return 0; } int a=10; //全局變量從此處定義
靜態變量
存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和 static 變量。
1.靜態局部變量:作為 static 局部變量在函數內定義,它的生存期為整個源程序,但是其作用域仍與局部變量相同,只能在定義該變量的函數內使用該變量。退出該函數后, 盡管該變量還繼續存在,但不能使用它!
#include <iostream>
using namespace std;
int count = 1; //全局變量
int fun()
{
static int count = 10; // 在第一次進入這個函數的時候,變量 count 被初始化為 10
return count--; //以后每次進入該函數就不會被再次初始化了,count 的值是上一次函數運行之后的值 (如果不用static的話,每次調用局部變量count都是10,也就是每次都會先初始化)
}
int main()
{
for(;count <= 10; ++count)
cout<<"全局變量:"<<count<<" 靜態局部變量:"<<fun()<<endl;
return 0;
}
輸出:
全局變量:1 靜態局部變量:10
全局變量:2 靜態局部變量:9
全局變量:3 靜態局部變量:8
全局變量:4 靜態局部變量:7
全局變量:5 靜態局部變量:6
全局變量:6 靜態局部變量:5
全局變量:7 靜態局部變量:4
全局變量:8 靜態局部變量:3
全局變量:9 靜態局部變量:2
全局變量:10 靜態局部變量:1
由此可見全局變量和局部靜態變量 count 的作用域是不同的。靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和全局變量的區別在於全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。
2.靜態全局變量:也具有全局作用域,它與全局變量的區別在於如果程序包含多個文件的話,它作用於定義它的文件里,不能作用到其它文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。
從分配內存空間看:全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧里分配空間。
總結:
static 全局變量:改變作用范圍,不改變存儲位置
static 局部變量:改變生命周期,不改變作用范圍
寫在后面:
靜態函數 :在函數的返回類型前加上static關鍵字,函數即被定義為靜態函數。靜態函數與普通函數不同,它只能在聲明它的文件當中可見,不能被其它文件使用。
如果在一個源文件中定義的函數,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用,這種函數也稱為內部函數。定義一個內部函數,只需在函數類型前再加一個“static”關鍵字即可。