細說C++全局變量、局部變量和靜態局部變量
2020-05-23 14:28:40
供稿:網友
我們已經在前面學習了變量,并且能夠熟練地使用它??墒?,僅僅靠這些知識,有些問題仍然無法得到解決。
標志符
首先要來介紹一下什么是標志符。在程序設計的過程中,經常要給變量、函數甚至是一些數據類型起名字(還包括以后的類名,對象名等)。我們把這些用戶根據一些規定,自己定義的各種名字統稱為標志符(Identifier)。顯然,標志符不允許和任何保留字相同。
全局變量和局部變量
在函數這一章節中,我們說過函數體內聲明的變量僅在該函數體內有效,別的函數是無法使用的。并且在函數運行結束后,這些變量也將消失了。我們把這些在函數體內聲明的變量稱為局部變量(Local Variable)。
然而,可能會遇到這樣的問題:我們想要創建一個變量作為數據緩沖區(Buffer),分別供數據生成、數據處理和數據輸出三個函數使用,三個函數都要能夠讀取或修改這個變量的值。顯然通過傳遞參數或返回值來解決這個問題是非常麻煩的。
那么,我們能否建立一個變量能夠讓這三個函數共同使用呢?在C++中,我們可以在函數體外聲明一個變量,它稱為全局變量(global variable)。所謂全局,是指對于所有函數都能夠使用。當然,在該變量聲明之前出現的函數是不知道該變量的存在的,于是也就無法使用它了。另外,如果我們聲明了一個全局變量之后沒有對它進行初始化操作,則編譯器會自動將它的值初始化為0。
下面,我們就用全局變量來實現剛才提出的那個問題:(程序11.1.1)
#include "iostream.h"
#include "stdlib.h"//用于產生隨機數,不必理會
#include "time.h"//用于產生隨機數,不必理會
#include "iomanip.h"//用于設置域寬
void makenum();
void output();
void cal();
int main()
{
srand(time(NULL));//用于產生隨機數,不必理會
for (int i=0;i<4;i++)
{
makenum();//產生隨機數放入緩沖區
cal();//對緩沖區的數進行處理
output();//輸出緩沖區的數值
}
return 0;
}
int buffer;//定義全局變量,以下函數都能使用它
void makenum()
{
cout <<"Running make number..." <<endl;
buffer=rand();//把產生的隨機數放入緩沖區
}
void cal()
{
cout <<"Running calculate..." <<endl;
buffer=buffer%100;
}
void output()
{
cout <<"Running output..." <<endl;
cout <<setw(2) <<buffer <<endl;
}
運行結果:
Running make number...
Running calculate...
Running output...
48
Running make number...
Running calculate...
Running output...
47
Running make number...
Running calculate...
Running output...
24
Running make number...
Running calculate...
Running output...
90
以上為某次運行得到的隨機結果??梢?,使用全局變量使得多個函數之間可以共享一個數據,同時從理論上實現了函數之間的通訊。
靜態局部變量
全局變量實現了函數之間共享數據,也使得變量不再會因為某個函數的結束而消亡。但是,新問題又出現了:一個密碼檢測函數根據調用(用戶輸錯密碼)的次數來限制他進入系統。如果把調用次數存放在一個局部變量里,顯然是不可行的。雖然全局變量可以記錄一個函數的運行次數,但是這個變量是被所有函數共享的,每個函數都能修改它,實在很危險。我們現在需要的是一個函數運行結束后不會消失的,并且其他函數無法訪問的變量。
C++中,我們可以在函數體內聲明一個靜態局部變量(Static Local Variable)。它在函數運行結束后不會消失,并且只有聲明它的函數中能夠使用它。聲明一個靜態局部變量的方法是在聲明局部變量前加上static,例如:
static int a;
和全局變量類似,如果我們沒有對一個靜態局部變量做初始化,則編譯器會自動將它初始化為0。
下面,我們就用靜態局部變量來模擬一下這個密碼檢測函數的功能:(程序11.1.2)
#include "iostream.h"
#include "stdlib.h"
bool password();//密碼檢測函數
int main()
{
do
{
}
while (password()!=true);//反復檢測密碼直到密碼正確
cout <<"歡迎您進入系統!" <<endl;
return 0;
}
bool password()
{
static numOfRun=0;//聲明靜態局部變量存放函數調用次數
if (numOfRun<3)
{
int psw;
cout <<"第" <<++numOfRun <<"次輸入密碼" <<endl;
cin >>psw;
if (psw==123456)
{
return true;
}
else
{
cout <<"密碼錯誤!" <<endl;
return false;
}
}
else
{
cout <<"您已經輸錯密碼三次!異常退出!" <<endl;
exit(0);//退出程序運行
}
}
第一次運行結果:
第1次輸入密碼
111111
密碼錯誤!
第2次輸入密碼
222222
密碼錯誤!
第3次輸入密碼
0
密碼錯誤!
您已經輸錯密碼三次!異常退出!
第二次運行結果:
第1次輸入密碼
000000
密碼錯誤!
第2次輸入密碼
123456
歡迎您進入系統!
使用靜態局部變量可以讓函數產生的數據更長期更安全地存儲。如果一個函數運行和它以前的運行結果有關,那么一般我們就會使用靜態局部變量。