解析static在C和C++中的用法以及區(qū)別
static主要有三個(gè)作用:
(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類型局部變量就是普通的局部變量(不加修飾的局部變量默認(rèn)為該類型)。該類型局部變量存儲在棧上,在動(dòng)態(tài)存儲區(qū),生命周期僅限于定義它的函數(shù),函數(shù)結(jié)束,它就自動(dòng)釋放。static類型局部變量存儲在靜態(tài)存儲區(qū),在程序整個(gè)運(yùn)行期間都不釋放。兩者之間的作用域相同,但生存期不同。
2. static局部變量在所處模塊在初次運(yùn)行時(shí)進(jìn)行初始化工作,且只操作一次。
3. 對于局部靜態(tài)變量,如果不賦初值,編譯期會自動(dòng)賦初值0或空字符,而auto類型的初值是不確定的。(對于C++中的class對象例外,class的對象實(shí)例如果不初始化,則會自動(dòng)調(diào)用默認(rèn)構(gòu)造函數(shù),不管是否是static類型)
特點(diǎn): static局部變量的”記憶性”與生存期的”全局性”
二、外部靜態(tài)變量/函數(shù)
在C中 static有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數(shù)。但為了限制全局變量/函數(shù)的作用域, 函數(shù)或變量前加static使得函數(shù)成為靜態(tài)函數(shù)。但此處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件(所以又稱內(nèi)部函 數(shù))。注意此時(shí), 對于外部(全局)變量, 不論是否有static限制, 它的存儲區(qū)域都是在靜態(tài)存儲區(qū),生存期都是全局的. 此時(shí)的static只是起作用域限制作用, 限定作用域在本模塊(文件)內(nèi)部.使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名。
三、靜態(tài)數(shù)據(jù)成員/成員函數(shù)(C++特有)
C+ +重用了這個(gè)關(guān)鍵字,并賦予它與前面不同的第三種含義:表示屬于一個(gè)類而不是屬于此類的任何特定對象的變量和函數(shù). 這是與普通成員函數(shù)的最大區(qū)別,也是其應(yīng)用所在, 比如在對某一個(gè)類的對象進(jìn)行計(jì)數(shù)時(shí), 計(jì)數(shù)生成多少個(gè)類的實(shí)例,就可以用到靜態(tài)數(shù)據(jù)成員. 在這里面, static既不是限定作用域的, 也不是擴(kuò)展生存期的作用, 而是指示變量/函數(shù)在此類中的唯一性. 這也是”屬于一個(gè)類而不是屬于此類的任何特定對象的變量和函數(shù)”的含義. 因?yàn)樗菍φ麄€(gè)類來說是唯一的,因此不可能屬于某一個(gè)實(shí)例對象的. (針對靜態(tài)數(shù)據(jù)成員而言, 成員函數(shù)不管是否是static, 在內(nèi)存中只有一個(gè)副本, 普通成員函數(shù)調(diào)用時(shí), 需要傳入this指針, static成員函數(shù)調(diào)用時(shí), 沒有this指針. )
上一篇:linux c程序中獲取shell腳本輸出的實(shí)現(xiàn)方法
欄 目:C語言
下一篇:歸并排序的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼
本文標(biāo)題:解析static在C和C++中的用法以及區(qū)別
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4221.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10深入解析最長公共子串
- 01-10c++中inline的用法分析
- 01-10深入理解堆排序及其分析
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入解析Linux下\r\n的問題


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載