static關鍵字<很詳細>

static關鍵字的做用
C中static的做用
修飾一:靜態局部變量
在修飾局部變量的時候,初始化局部變量只執行一次,並且延長了局部變量的生命週期,直到程序運行結束之後才釋放。若是未對其初始化,系統會對默認初始化0或\0;ide

修飾二:靜態全局變量
這個全局變量只能在本文件中訪問,不能在其它文件中訪問,即使是extern外部聲明也不能夠。其餘文件中也能夠定義和該變量同樣的名字且不會衝突;函數

修飾三:靜態函數
和靜態全局變量同樣,只能在該文件中被調用,其餘文件不能調用。this

C++中static的做用
C++中static的做用除了具備C中的做用以外還具備如下做用:指針

修飾一:靜態數據成員
一、靜態數據成員是在程序開始運行時被分配空間,到程序結束以後才釋放,只要類中指定了靜態數據成員,即便不定義對象,也會爲靜態數據成員分配空間;
二、靜態數據成員能夠被初始化,可是隻能在類體外進行初始化,若未對靜態數據成員賦初值,則編譯器會自動爲其初始化爲0;
三、靜態數據成員既能夠經過對象名引用,也能夠經過類名引用。對象

修飾二:靜態成員函數
一、靜態成員函數和靜態數據成員同樣,他們都屬於類的靜態成員,而不是對象成員;
二、靜態成員函數沒有this指針;
三、靜態成員函數主要用來訪問靜態數據成員而不能訪問非靜態成員。生命週期

【簡單延伸一點:爲何靜態成員不能訪問非靜態成員?】
首先static的成員是在類加載的時候初始化的,JVM的CLASSLOADER的加載,首次主動使用加載,而非static的成員是在建立對象的時候,即new 操做的時候才初始化的;內存

前後順序是先加載,才能初始化,那麼加載的時候初始化static的成員,此時非static的成員尚未被加載必然不能使用,而非static的成員是在類加載以後,經過new操做符建立對象的時候初始化,此時static 已經分配內存空間,因此能夠訪問!編譯器

簡單點說:靜態成員屬於類,不須要生成對象就存在了.而非靜態須要生成對象才產生。it

相關文章
相關標籤/搜索