1.先來介紹它的第一條也是最重要的一條:隱藏。(static函數,static變量均可)
當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。
2.static的第二個作用是保持變量內容的持久。
(static變量中的記憶功能和全局生存期)存儲在靜態數 據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存 儲區:全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底 static還是用來隱藏的。
3.static的第三個作用是默認初始化為0(static變量)
其實全局變量也具備這一屬性,因為全局變量也存儲在靜態數據區。在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。
4.static的第四個作用:C++中的類成員聲明static
1) 函數體內static變量的作用范圍為該函數體,不同於auto變量,該變量的內存只被分配一次,因此其 值在下次調用時仍維持上次的值;
2) 在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
3) 在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模 塊內;
4) 在類中的static成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;
5) 在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員變量。
類內:
6) static類對象必須要在類外進行初始化,static修飾的變量先於對象存在,所以static修飾的變量要在類外初始化;
7) 由於static修飾的類成員屬於類,不屬於對象,因此static類成員函數是沒有this指針的,this指針是指向本對象的指針。正因為沒有this指針,所以static類成員函數不能訪問非static的類成員,只能訪問 static修飾的類成員;
8) static成員函數不能被virtual修飾,static成員不屬於任何對象或實例,所以加上virtual沒有任何實際意義;靜態成員函數沒有this指針,虛函數的實現是為每一個對象分配一個vptr指針,而vptr是通過this 指針調用的,所以不能為virtual;虛函數的調用關系,this->vptr->ctable->virtual function
51、靜態變量什么時候初始化
1) 初始化只有一次,但是可以多次賦值,在主程序之前,編譯器已經為其分配好了內存。
2) 靜態局部變量和全局變量一樣,數據都存放在全局區域,所以在主程序之前,編譯器已經為其分配 好了內存,但在C和C++中靜態局部變量的初始化節點又有點不太一樣。在C中,初始化發生在代碼執行 之前,編譯階段分配好內存之后,就會進行初始化,所以我們看到在C語言中無法使用變量對靜態局部 變量進行初始化,在程序運行結束,變量所處的全局內存會被全部回收。
3) 而在C++中,初始化時在執行相關代碼時才會進行初始化,主要是由於C++引入對象后,要進行初始 化必須執行相應構造函數和析構函數,在構造函數或析構函數中經常會需要進行某些程序中需要進行的 特定操作,並非簡單地分配內存。所以C++標准定為全局或靜態對象是有首次用到時才會進行構造,並 通過atexit()來管理。在程序結束,按照構造順序反方向進行逐個析構。所以在C++中是可以使用變量對 靜態局部變量進行初始化的。