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有了第二種含義:用來表示不能被其它檔案訪問的全域性變數和函式。但為了限制全域性變數/函式的作用域, 函式或變數前加stati程式設計客棧c使得函式成為靜態函式。但此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案(所以又稱內部函 數)。注意此時, 對於外部(全域性)變數, 不論是否有static限制, 它的儲存區域都是在靜態儲存區,生存期都是全域性的. 此時的static只是起作用域限制作用, 限定作用域在本模組(檔案)內部.使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名。
三、靜態資料成員/成員函式(c++特有)
c+ +重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於乙個類而不是屬於此類的任程式設計客棧何特定物件的變數和函式. 這是與普通成員函式的最大區別,也是其應用所在, 比如在對某乙個類的物件進行計數時, 計數生成多少個類的例項,就可以用到靜態資料成員. 在這裡面, static既不是限定作用域的, 也不是擴充套件生存期的作用, 而是指示變數/函式在此類中的唯一性. 這也是」屬於乙個類而不是屬於此類的任何特定物件的變數和函式」的含義. 因為它是對整個類來說是唯一的,因此不可能屬於某乙個例項物件的. (針對靜態資料成員而言, 成員函式不管是否是static, 在記憶體中只有乙個副本, 普通成員函式呼叫時, 需要傳入this指標,程式設計客棧 static成員函式呼叫時, 沒有this指標. )
本文標題: 解析static在c和c++中的用法以及區別
本文位址: /ruanjian/c/98957.html
static在c和c 中的區別
c 類的static使函式成為類成員,而不是例項成員 static在c裡面可以用來修飾變數,也可以用來修飾函式。先看用來修飾變數的時候。變數在c裡面可分為存在全域性資料區 棧和堆裡。其實我們平時所說的堆疊是棧而不包含堆,不要弄混。int main a是全域性變數,b是棧變數,c是堆變數。static...
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不常用到,下...