一.Static的作用詳述
摘要:C語言中慷荔,static的字面意思很容易把我們導(dǎo)入歧途雕什。本文將對C/C++中Static進(jìn)行詳述。
1.先來介紹它的第一條也是最重要的一條:隱藏显晶。
當(dāng)我們同時編譯多個文件時贷岸,所有未加static前綴的全局變量和函數(shù)都具有全局可見性。為理解這句話磷雇,我舉例來說明偿警。我們要同時編譯兩個源文件,一個是a.c唯笙,另一個是main.c.
下面是a.c的內(nèi)容:
char a = 'A'; // global variable
void msg()
{
printf("Hello\n");
}
下面是main.c的內(nèi)容:
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
程序的運行結(jié)果是:
A Hello
你可能會問:為什么在a.c中定義的全局變量a和函數(shù)msg能在main.c中使用螟蒸?前面說過盒使,所有未加static前綴的全局變量和函數(shù)都具有全局可見性,其它的源文件也能訪問七嫌。此例中少办,a是全局變量,msg是函數(shù)诵原,并且都沒有加static前綴英妓,因此對于另外的源文件main.c是可見的。
如果加了static绍赛,就會對其它源文件隱藏鞋拟。例如在a和msg的定義前加上static,main.c就看不到它們了惹资。利用這一特性可以在不同的文件中定義同名函數(shù)和同名變量贺纲,而不必?fù)?dān)心命名沖突。Static可以用作函數(shù)和變量的前綴褪测,對于函數(shù)來講猴誊,static的作用僅限于隱藏,而對于變量侮措,static還有下面兩個作用懈叹。
2.static的第二個作用是保持變量內(nèi)容的持久。
存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運行時就完成初始化分扎,也是唯一的一次初始化澄成。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量,只不過和全局變量比起來畏吓,static可以控制變量的可見范圍墨状,說到底static還是用來隱藏的。雖然這種用法不常見菲饼,但我還是舉一個例子肾砂。
#include<stdio.h>
int fun(void){
static int count = 10; //事實上此賦值語句從來沒有執(zhí)行過
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count<= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
程序的運行結(jié)果是:
global local static
110
29
38
47
56
65
74
83
92
101
3.static的第三個作用是默認(rèn)初始化為0.其實全局變量也具備這一屬性,因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)宏悦。
在靜態(tài)數(shù)據(jù)區(qū)镐确,內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時候這一特點可以減少程序員的工作量饼煞。比如初始化一個稀疏矩陣源葫,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值砖瞧。如果定義成靜態(tài)的息堂,就省去了一開始置0的操作。再比如要把一個字符數(shù)組當(dāng)字符串來用,但又覺得每次在字符數(shù)組末尾加‘\0’太麻煩。如果把字符串定義成靜態(tài)的遵湖,就省去了這個麻煩册着,因為那里本來就是‘\0’。不妨做個小實驗驗證一下晒来。
#include<stdio.h>
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
程序的運行結(jié)果如下integer:0;string:(begin)(end)
最后對static的三條作用做一句話總結(jié)。首先static的最主要功能是隱藏屡拨,其次因為static變量存放在靜態(tài)存儲區(qū),所以它具備持久性和默認(rèn)值0.
二.const和static const的區(qū)別
對于C/C++語言來講,
const就是只讀的意思,只在聲明中使用;
static一般有2個作用,規(guī)定作用域和存儲方式.對于局部變量,static規(guī)定其為靜態(tài)存儲方式,每次調(diào)用的初始值為上一次調(diào)用的值,調(diào)用結(jié)束后存儲空間不釋放;
對于全局變量,如果以文件劃分作用域的話,此變量只在當(dāng)前文件可見;對于static函數(shù)也是在當(dāng)前模塊內(nèi)函數(shù)可見.
static const應(yīng)該就是上面兩者的合集.
下面分別說明:
全局:
const,只讀的全局變量,其值不可修改.
static,規(guī)定此全局變量只在當(dāng)前模塊(文件)中可見.
static const,既是只讀的,又是只在當(dāng)前模塊中可見的.
文件:
文件指針可當(dāng)作一個變量來看,與上面所說類似.
函數(shù):
const,返回只讀變量的函數(shù).
static,規(guī)定此函數(shù)只在當(dāng)前模塊可見.
類:
const,一般不修飾類,(在VC6.0中試了一下,修飾類沒啥作用)
static,C++中似乎沒有靜態(tài)類這個說法,一般還是拿類當(dāng)特殊的變量來看.C#中有靜態(tài)類的詳細(xì)說明,且用法與普通類大不相同.