在C語言中,關鍵字static的意思是靜態的,有3個明顯的作用:
1. 在函數體內,靜態變量具有記憶作用,即一個被聲明為靜態的變量在這一函數被調用的過程中其值維持不變。
2. 在模塊內(但在函數體外),它的作用域范圍是有限制的,如果一個變量被聲明為靜態的,那么該變量可以被模塊內所有的函數訪問,但不能被模塊外的其他函數訪問。
3. 內部函數應該在當前源文件中說明和定義,對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,使用這些函數的源文件要包含這個頭文件。
static全局變量和普通全局變量的區別:static全局變量只初始化一次,這是為了防止它在其他文件單元中引用。
static局部變量和普通局部變量的區別:static局部變量只初始化一次,下次的運算依據是上一次的結果值。
static函數與普通函數的區別在與作用域不一樣,static()函數只在一個源文件中有效,不能被其它源文件使用。
靜態數據成員的特點:
1. 對於非靜態數據成員,每個類都有自己的復制品。而靜態數據成員被當做是類的成員。無論這個類的對象被定義了多少個,
靜態數據成員在程序中也只有一份復制品,由該類型的所有對象共享訪問。
2. 靜態數據成員存儲在全局數據區。定義時要分配空間,所以不能在類聲明中定義。由於靜態數據成員屬於本類的所有對象共享,所以他不屬於特的類對象,在沒有產生類對象時,其作用域就可見,即在沒有產生類的實例時,程序員也可以使用它。
3. 靜態數據成員也遵從public、protect、private訪問規則。
4. static成員變量的初始化在類外,此時不能再帶上static的關鍵字。private、protect的static成員雖然可以在類外初始化,但是不能在類外被訪問。
靜態數據成員的優勢:
1. 靜態數據成員沒有進入程序的全局名字空間,因此不存在與程序中其他全局名字沖突的可能性。
2.可以實現信息隱藏。靜態數據成員可以使private成員,而全局變量不能。
#include<stdio.h> #include <iostream> #include "a.h" using namespace std; void fun(int i) { static int value = i++; cout<<value<<endl; } int main() { fun(0); fun(1); fun(2); return 0; }
運行結果: 0
運行結果: 0
運行結果: 0