[C/C++] static在C和C++中的用法和區別


轉自:http://blog.csdn.NET/skyereeee/article/details/8000512

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指針 )。對於靜態成員函數,只能訪問靜態成員函數和靜態成員變量,不能訪問非靜態成員函數或者變量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM