解析static在C和C++中的用法以及區(qū)別
static主要有三個作用:
(1)局部靜態(tài)變量
(2)外部靜態(tài)變量/函數(shù)
(3)靜態(tài)數(shù)據(jù)成員/成員函數(shù)
前兩種C和C++都有,第三種僅在C++中有,下面分別作以下介紹:
一、局部靜態(tài)變量
在C/C++中, 局部變量按照存儲形式可分為三種auto, static, register。其中register不常用到,下面主要說說auto和static的區(qū)別。
1. 存儲空間分配和生存周期不同
auto類型局部變量就是普通的局部變量(不加修飾的局部變量默認為該類型)。該類型局部變量存儲在棧上,在動態(tài)存儲區(qū),生命周期僅限于定義它的函數(shù),函數(shù)結束,它就自動釋放。static類型局部變量存儲在靜態(tài)存儲區(qū),在程序整個運行期間都不釋放。兩者之間的作用域相同,但生存期不同。
2. static局部變量在所處模塊在初次運行時進行初始化工作,且只操作一次。
3. 對于局部靜態(tài)變量,如果不賦初值,編譯期會自動賦初值0或空字符,而auto類型的初值是不確定的。(對于C++中的class對象例外,class的對象實例如果不初始化,則會自動調用默認構造函數(shù),不管是否是static類型)
特點: static局部變量的”記憶性”與生存期的”全局性”
二、外部靜態(tài)變量/函數(shù)
在C中 static有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數(shù)。但為了限制全局變量/函數(shù)的作用域, 函數(shù)或變量前加static使得函數(shù)成為靜態(tài)函數(shù)。但此處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件(所以又稱內部函 數(shù))。注意此時, 對于外部(全局)變量, 不論是否有static限制, 它的存儲區(qū)域都是在靜態(tài)存儲區(qū),生存期都是全局的. 此時的static只是起作用域限制作用, 限定作用域在本模塊(文件)內部.使用內部函數(shù)的好處是:不同的人編寫不同的函數(shù)時,不用擔心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名。
三、靜態(tài)數(shù)據(jù)成員/成員函數(shù)(C++特有)
C+ +重用了這個關鍵字,并賦予它與前面不同的第三種含義:表示屬于一個類而不是屬于此類的任何特定對象的變量和函數(shù). 這是與普通成員函數(shù)的最大區(qū)別,也是其應用所在, 比如在對某一個類的對象進行計數(shù)時, 計數(shù)生成多少個類的實例,就可以用到靜態(tài)數(shù)據(jù)成員. 在這里面, static既不是限定作用域的, 也不是擴展生存期的作用, 而是指示變量/函數(shù)在此類中的唯一性. 這也是”屬于一個類而不是屬于此類的任何特定對象的變量和函數(shù)”的含義. 因為它是對整個類來說是唯一的,因此不可能屬于某一個實例對象的. (針對靜態(tài)數(shù)據(jù)成員而言, 成員函數(shù)不管是否是static, 在內存中只有一個副本, 普通成員函數(shù)調用時, 需要傳入this指針, static成員函數(shù)調用時, 沒有this指針. )
相關文章
Linux網(wǎng)絡編程之UDP Socket程序示例
這篇文章主要介紹了Linux網(wǎng)絡編程之UDP Socket程序示例,有助于讀者在實踐中掌握UDP協(xié)議的原理及應用方法,需要的朋友可以參考下2014-08-08C++實現(xiàn)LeetCode(13.羅馬數(shù)字轉化成整數(shù))
這篇文章主要介紹了C++實現(xiàn)LeetCode(13.羅馬數(shù)字轉化成整數(shù)),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù)
這篇文章主要介紹了C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01