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