天天看點

c/c++ static關鍵字

概述

最近在寫c++/c混合項目的時候,候發現static關鍵字在c/c++中用的時候,有些地方了解不到位,做簡單學習總結。

static 有三個作用:局部靜态變量; 外部靜态變量/函數; 靜态資料成員/成員函數。

前兩種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指針 )。

對于靜态成員函數,隻能通路靜态成員函數和靜态成員變量,不能通路非靜态成員函數或者變量。

繼續閱讀