一開始認識的時候,很多人覺得static和const規定的變量是不是都不能改變,所以就無法區分這兩個關鍵詞
首先字面上理解,const是隻讀的意思,static是靜態的,其次const只在變量聲明中使用,而static很重要的一個作用就是規定作用域
我們將C++中的變量分爲四個級別:全局變量、函數外static變量、函數內static變量、局部變量
1、全局變量:不僅在定義該變量的源文件中可用,而且在任一別的源文件中只要用 extern 聲明它後也可以使用。
2、函數外static變量:函數外的static變量處於文件域中,只有定義它的源文件中可以使用。如果你看到一個static變量,那是作者在安慰你:哥們(妹子),這個變量不會在別的文件中出現。
3、函數內static變量:函數內static變量在函數的每次調用中可用(只初始化一次), 它同以上兩種變量一樣在程序運行期間一直存在,所以它的功能是局部變量無法實現的。
4、局部變量:在函數的一次調用中使用,調用結束後就消失了。
顯然,作用域越小越省心,該是局部變量的就不要定義成全局變量,如果"全局變量"只在本源文件中使用那就加個static。
那麼根據這個定義,我們可以認定所有的全局變量都是靜態變量,因爲作用域巨大!對於局部變量,只有聲明瞭static纔是局部變量,對比兩個程序,一個在Test函數中使用普通int變量,一個在Test函數中使用靜態變量。
#include<stdio.h>
int Test(){
int c=5;
c++;
printf("%d\n",c);
}
int main(){
Test();
Test();
return 0;
}
#include<stdio.h>
int Test(){
static int c=5;
c++;
printf("%d\n",c);
}
int main(){
Test();
Test();
Test();
return 0;
}
前者輸出6 6 6,後者出書6 7 8。對於普通變量而言,函數一旦結束,變量的空間就會被釋放。而對於靜態變量,其存儲空間爲內存的靜態數據區,該區域中的數據在整個程序的運行期間都不被釋放,也可以認爲其內存地址是不變的,直到整個程序結束(屬於靜態存儲方式的變量不都是靜態變量,比如外部變量只有加上static之後纔是靜態變量)
我們對比兩個程序可以發現,靜態變量的第二次定義並沒有生效,要注意的一點是,對於一般的變量,如果我們重複定義不僅僅不會忽略第二次定義,甚至還會報錯。而對於靜態變量則不是,系統只要看到了這是靜態變量便會直接忽略第二次定義,前提當然要在定義域。
另外如果把上面的變量定義成const,那麼程序是會報錯的,顯示read-only。
我們對比兩個程序,不難發現除了保持”靜態“之外,static其實也變相規定了變量的作用域,那麼我們對比來看
在C++中,我們分變量、文件還有函數三種;類型來說明const和static的區別
1、對於變量而言
const表示是隻讀變量,一切試圖改變const變量的指令均會被報錯;
static規定此全局變量只在當前模塊或者文件中可見
2、對於文件而言
文件指針在C++中可以看作是一個變量,所以與變量類似
3、對於函數而言
const返回只讀變量的函數
staitc規定此函數僅僅在當前模塊中可見
特殊的,static const表示該變量既是隻讀的,又是隻在當前模塊中可見的。最後
//const表示指針
int const *a; file://a可變,*a不可變
int *const a; file://a不可變,*a可變