const和static的作用辨析以及const和static的區別

一開始認識的時候,很多人覺得static和const規定的變量是不是都不能改變,所以就無法區分這兩個關鍵詞

首先字面上理解,const是隻讀的意思,static是靜態的,其次const只在變量聲明中使用,而static很重要的一個作用就是規定作用域

我們將C++中的變量分爲四個級別:全局變量、函數外static變量、函數內static變量、局部變量

1、全局變量:不僅在定義該變量的源文件中可用,而且在任一別的源文件中只要用 extern 聲明它後也可以使用。

2、函數外static變量:函數外的static變量處於文件域中,只有定義它的源文件中可以使用。如果你看到一個static變量,那是作者在安慰你:哥們(妹子),這個變量不會在別的文件中出現。

3、函數內static變量:函數內static變量在函數的每次調用中可用(只初始化一次), 它同以上兩種變量一樣在程序運行期間一直存在,所以它的功能是局部變量無法實現的。

4、局部變量:在函數的一次調用中使用,調用結束後就消失了。

  顯然,作用域越小越省心,該是局部變量的就不要定義成全局變量,如果"全局變量"只在本源文件中使用那就加個static。


所謂的靜態變量,並不是指的是該變量的值無法被改變,不能改變值的量叫做常量,我們可以用const來修飾,而之所以說它是靜態變量,指的是不會隨着函數的調用和退出而發生變化。

  那麼根據這個定義,我們可以認定所有的全局變量都是靜態變量,因爲作用域巨大!對於局部變量,只有聲明瞭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可變 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章