面向過程程序設(shè)計中的Static
1. 全局靜態(tài)變量
在全局變量之前加上關(guān)鍵字static,全局變量就被定義成為一個全局靜態(tài)變量。
1)內(nèi)存中的位置:靜態(tài)存儲區(qū)(靜態(tài)存儲區(qū)在整個程序運行期間都存在)。
2)初始化:未經(jīng)初始化的全局靜態(tài)變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)。
3)作用域:全局靜態(tài)變量在聲明他的文件之外是不可見的。準確地講從定義之處開始到文件結(jié)尾。
定義全局靜態(tài)變量的好處:
<1>不會被其他文件所訪問,修改。
<2>其他文件中可以使用相同名字的變量,不會發(fā)生沖突。
2. 局部靜態(tài)變量
在局部變量之前加上關(guān)鍵字static,局部變量就被定義成為一個局部靜態(tài)變量。
1)內(nèi)存中的位置:靜態(tài)存儲區(qū)。
2)初始化:未經(jīng)初始化的全局靜態(tài)變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)。
3)作用域:作用域仍為局部作用域,當(dāng)定義它的函數(shù)或者語句塊結(jié)束的時候,作用域隨之結(jié)束。
注:當(dāng)static用來修飾局部變量的時候,它就改變了局部變量的存儲位置,從原來的棧中存放改為靜態(tài)存儲區(qū)??荚?大提示局部靜態(tài)變量在離開作用域之后,并沒有被銷毀,而是仍然駐留在內(nèi)存當(dāng)中,直到程序結(jié)束,只不過我們不能再對他進行訪問。
當(dāng)static用來修飾全局變量的時候,它就改變了全局變量的作用域(在聲明他的文件之外是不可見的),但是沒有改變它的存放位置,還是在靜態(tài)存儲區(qū)中。
3. 靜態(tài)函數(shù)
在函數(shù)的返回類型前加上關(guān)鍵字static,函數(shù)就被定義成為靜態(tài)函數(shù)。
函數(shù)的定義和聲明默認情況下是extern的,但靜態(tài)函數(shù)只是在聲明他的文件當(dāng)中可見,不能被其他文件所用。
定義靜態(tài)函數(shù)的好處:
<1> 其他文件中可以定義相同名字的函數(shù),不會發(fā)生沖突。
<2> 靜態(tài)函數(shù)不能被其他文件所用。
存儲說明符auto,register,extern,static,對應(yīng)兩種存儲期:自動存儲期和靜態(tài)存儲期。
auto和register對應(yīng)自動存儲期。具有自動存儲期的變量在進入聲明該變量的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。
關(guān)鍵字extern和static用來說明具有靜態(tài)存儲期的變量和函數(shù)。用static聲明的局部變量具有靜態(tài)存儲持續(xù)期(static storage duration),或靜態(tài)范圍(static extent)。雖然他的值在函數(shù)調(diào)用之間保持有效,但是其名字的可視性仍限制在其局部域內(nèi)。靜態(tài)局部對象在程序執(zhí)行到該對象的聲明處時被首次初始化。
擴展分析:
術(shù)語static有著不尋常的歷史.起初,在C中引入關(guān)鍵字static是為了表示退出一個塊后仍然存在的局部變量。隨后,static C中有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數(shù)。為了避免引入新的關(guān)鍵字,所以仍使用static關(guān)鍵字來表示這第二種含義。最后,C++重用了這個關(guān)鍵字,并賦予它與前面不同的第三種含義:表示屬于一個類而不是屬于此類的任何特定對象的變量和函數(shù)(與Java中此關(guān)鍵字的含義相同)。
1. 全局靜態(tài)變量
在全局變量之前加上關(guān)鍵字static,全局變量就被定義成為一個全局靜態(tài)變量。
1)內(nèi)存中的位置:靜態(tài)存儲區(qū)(靜態(tài)存儲區(qū)在整個程序運行期間都存在)。
2)初始化:未經(jīng)初始化的全局靜態(tài)變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)。
3)作用域:全局靜態(tài)變量在聲明他的文件之外是不可見的。準確地講從定義之處開始到文件結(jié)尾。
定義全局靜態(tài)變量的好處:
<1>不會被其他文件所訪問,修改。
<2>其他文件中可以使用相同名字的變量,不會發(fā)生沖突。
2. 局部靜態(tài)變量
在局部變量之前加上關(guān)鍵字static,局部變量就被定義成為一個局部靜態(tài)變量。
1)內(nèi)存中的位置:靜態(tài)存儲區(qū)。
2)初始化:未經(jīng)初始化的全局靜態(tài)變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)。
3)作用域:作用域仍為局部作用域,當(dāng)定義它的函數(shù)或者語句塊結(jié)束的時候,作用域隨之結(jié)束。
注:當(dāng)static用來修飾局部變量的時候,它就改變了局部變量的存儲位置,從原來的棧中存放改為靜態(tài)存儲區(qū)??荚?大提示局部靜態(tài)變量在離開作用域之后,并沒有被銷毀,而是仍然駐留在內(nèi)存當(dāng)中,直到程序結(jié)束,只不過我們不能再對他進行訪問。
當(dāng)static用來修飾全局變量的時候,它就改變了全局變量的作用域(在聲明他的文件之外是不可見的),但是沒有改變它的存放位置,還是在靜態(tài)存儲區(qū)中。
3. 靜態(tài)函數(shù)
在函數(shù)的返回類型前加上關(guān)鍵字static,函數(shù)就被定義成為靜態(tài)函數(shù)。
函數(shù)的定義和聲明默認情況下是extern的,但靜態(tài)函數(shù)只是在聲明他的文件當(dāng)中可見,不能被其他文件所用。
定義靜態(tài)函數(shù)的好處:
<1> 其他文件中可以定義相同名字的函數(shù),不會發(fā)生沖突。
<2> 靜態(tài)函數(shù)不能被其他文件所用。
存儲說明符auto,register,extern,static,對應(yīng)兩種存儲期:自動存儲期和靜態(tài)存儲期。
auto和register對應(yīng)自動存儲期。具有自動存儲期的變量在進入聲明該變量的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。
關(guān)鍵字extern和static用來說明具有靜態(tài)存儲期的變量和函數(shù)。用static聲明的局部變量具有靜態(tài)存儲持續(xù)期(static storage duration),或靜態(tài)范圍(static extent)。雖然他的值在函數(shù)調(diào)用之間保持有效,但是其名字的可視性仍限制在其局部域內(nèi)。靜態(tài)局部對象在程序執(zhí)行到該對象的聲明處時被首次初始化。
擴展分析:
術(shù)語static有著不尋常的歷史.起初,在C中引入關(guān)鍵字static是為了表示退出一個塊后仍然存在的局部變量。隨后,static C中有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數(shù)。為了避免引入新的關(guān)鍵字,所以仍使用static關(guān)鍵字來表示這第二種含義。最后,C++重用了這個關(guān)鍵字,并賦予它與前面不同的第三種含義:表示屬于一個類而不是屬于此類的任何特定對象的變量和函數(shù)(與Java中此關(guān)鍵字的含義相同)。