static在C和C 中的用法和區別

2021-06-19 01:41:53 字數 1405 閱讀 1139

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指標. )

static在C和C 中的用法和區別

static主要有三個作用 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 前兩種c和c 都有,第三種僅在c 中有,下面分別作以下介紹 一 區域性靜態變數 在c c 中,區域性變數按照儲存形式可分為三種auto,static,register。其中register不常用到,下...

static在C和C 中的用法和區別

static主要有三個作用 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 前兩種c和c 都有,第三種僅在c 中有,下面分別作以下介紹 一 區域性靜態變數 在c c 中,區域性變數按照儲存形式可分為三種auto,static,register。其中register不常用到,下...

static在C和C 中的用法和區別

static主要有三個作用 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 前兩種c和c 都有,第三種僅在c 中有,下面分別作以下介紹 一 區域性靜態變數 在c c 中,區域性變數按照儲存形式可分為三種auto,static,register。其中register不常用到,下...