程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 解析static在C和C++中的用法以及區別

解析static在C和C++中的用法以及區別

編輯:C語言基礎知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved