C C 的static關鍵字

2021-07-12 05:33:25 字數 1349 閱讀 4533

static主要有三個作用:

(1)區域性靜態變數

(2)外部靜態變數/函式

(3)靜態資料成員/成員函式 

前兩種c和c++都有,第三種僅在c++中有,下面分別作以下介紹:

一、區域性靜態變數

在c/c++中, 區域性變數按照儲存形式可分為三種auto, static, register。其中register不常用到,下面主要說說auto和static的區別。

1. 儲存空間分配和生存週期不同

auto型別區域性變數就是普通的區域性變數(不加修飾的區域性變數預設為該型別)。該型別區域性變數儲存在棧上,在動態儲存區,生命週期僅限於定義它的函式,函式結束,它就自動釋放。static型別區域性變數儲存在靜態儲存區,在程式整個執行期間都不釋放。兩者之間的作用域相同,但生存期不同。

2. static區域性變數在所處模組在初次執行時進行初始化工作,且只操作一次。

3. 對於區域性靜態變數,如果不賦初值,編譯期會自動賦初值0或空字元,而auto型別的初值是不確定的。(對於c++中的class物件例外,class的物件例項如果不初始化,則會自動呼叫預設建構函式,不管是否是static型別)

特點: static區域性變數的」記憶性」與生存期的」全域性性」

二、外部靜態變數/函式

在c中 static有了第二種含義:用來表示不能被其它檔案訪問的全域性變數和函式。但為了限制全域性變數/函式的作用域, 函式或變數前加static使得函式成為靜態函式。但此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案(所以又稱內部函 數)。注意此時, 對於外部(全域性)變數, 不論是否有static限制, 它的儲存區域都是在靜態儲存區,生存期都是全域性的. 此時的static只是起作用域限制作用, 限定作用域在本模組(檔案)內部.使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名。

三、靜態資料成員/成員函式(c++特有)

c+ +重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於乙個類而不是屬於此類的任何特定物件的變數和函式. 這是與普通成員函式的最大區別,也是其應用所在, 比如在對某乙個類的物件進行計數時, 計數生成多少個類的例項,就可以用到靜態資料成員. 在這裡面, static既不是限定作用域的, 也不是擴充套件生存期的作用, 而是指示變數/函式在此類中的唯一性. 這也是」屬於乙個類而不是屬於此類的任何特定物件的變數和函式」的含義. 因為它是對整個類來說是唯一的,因此不可能屬於某乙個例項物件的. (針對靜態資料成員而言, 成員函式不管是否是static, 在記憶體中只有乙個副本, 普通成員函式呼叫時, 需要傳入this指標, static成員函式呼叫時, 沒有this指標. )

C C 中的static關鍵字

關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數只能被定義該變數的函式所識別,但是不同於自動變數的是,static變數在其函式被呼叫退出後,仍保留其值。下次函式被呼叫時,可以訪問最近一次被修改後的值。static變數的宣告方法如下 static in...

C C 中的static關鍵字

static的用法主要分為兩大類,一種是在c語言中的用法,還有就是c 在類中的用法。2.在c 中 定義靜態全域性變數就是在全域性變數前加上 static 關鍵字 include static int a 10 這是靜態全域性變數 靜態全域性資料的特點 1 靜態全域性變數就在全域性資料段分配記憶體。2...

C C 中的static關鍵字

原理 預設的變數和函式名在編譯成彙編 s檔案後,會有.globl func name,globl指示告訴彙編器,func name這個符號要被鏈結器用到 彙編檔案在經過彙編器處理成二進位制的.o檔案時,符號會被變數或函式實際的位址值代替 所以要在目標檔案的符號表中標記它是乙個全域性符號。如果乙個變數...