變量的存儲類型:存儲類型按變量的生存期劃分,分動態存儲方式和靜態存儲方式。函數
1)動態存儲方式的變量,生存期爲變量所在的做用域。即程序運行到此變量時才爲其分配存儲空間,做用域結束時,會自動收回爲其分配的存儲空間。this
2)靜態存儲方式的變量,生存期爲整個程序執行的過程。即程序開始時就爲其分配存儲空間,程序結束時,纔會收回爲其分配的存儲空間。spa
4種變量的存儲類型:指針
1)自動類型(auto):動態存儲方式的變量,局部變量,auto經常省略。code
2)寄存器類型變量(register):動態存儲方式的變量,編譯器不爲此類型變量分配存儲空間,而是直接使用CPU的寄存器。存取速度快,主要用於控制循環次數等不須要長期保存值的變量。對象
3)外部類型變量(extern):靜態存儲方式的變量,系統自動初始化值,又叫全局變量,全局變量是從做用域提出的,外部變量是從存儲方式提出的,表示了它的生存期。blog
4)靜態存儲變量(static):靜態存儲方式的變量,系統自動初始化值,靜態變量只能在它的做用範圍內使用。作用域
static:靜態存儲變量的類型說明符。編譯器
static局部變量:在函數內的局部變量類型說明符前加上static說明符就構成靜態局部變量。局部變量變爲靜態局部變量,即改變了它的生存期。it
void Fun() { static int i; //static局部變量 ... }
1)static局部變量在函數內定義。
2)static局部變量的生存期是整個程序。
3)static局部變量的做用域爲函數體內。但再次調用定義此函數時,又可繼續使用此變量,並且保存了前次被調用後留下的值。
int Fun1() { int i = 0; //局部變量 i++; return i; } int Fun2() { static int i; //static局部變量 i++; return i; } int main(int argc, char* argv[]) { int iRet = 0; iRet = Fun1(); //iRet = 1; iRet = Fun1(); //iRet = 1; iRet = Fun2(); //iRet = 1; iRet = Fun2(); //iRet = 2; return 0; }
static全局變量:在全局變量類型說明符前加上static就構成靜態的全局變量。全局變量變成靜態全局變量,即改變了它的做用域。
1)當一個源程序由若干個源文件組成時,在一個源文件中定義的外部變量要在其它的源文件中使用,在使用前就用extern進行外部聲明。
2)若是在一個源文件中定義的外部變量不想讓其它源文件使用,則必須聲明爲static全局變量,只能供所在的源文件使用。同時能夠避免在其它源文件中引發錯誤。
//全局變量 file1.cpp int gNum; main() { gNum++; } file2.cpp extern int gNum; main() { gNum++; } //static全局變量 file3.cpp static int gNum; main() { gNum++; }
static類成員變量:類的全部對象都用同一個static成員變量。經過對象名或類名均可以調用。
class A { public: static int x; int y; }; A a1,a2; //建立了兩個A的對象 a1.x = 1; //A::x = 1;或a2.x = 1;同樣,都是對static int x;操做,x = 1; a1.y = 1; //a1對象裏面y = 1; a2.y = 2; //a2對象裏面y = 2;
static類成員變量和普通數據成員同樣,不能在類的定義體中初始化,只能在類外進行初始化。但static const卻能夠。
int y = 200; class A { public: static const int x = 100; static int y; };
static類成員函數:類的全部對象都用同一個static成員函數。經過對象名或類名均可以調用。
1)static類成員函數沒有this指針。
2)static類成員函數不能被聲明爲const和虛函數。
3)static類成員函數能夠訪問所屬類的static成員變量,但不能使用非static成員變量。
class A { public: static int x; int y; static void Fun(); //static成員函數 }; static void Fun() { x++; //能夠 y++; //不能夠 } A a1; a1.Fun(); //或A::fun();