1. 程式人生 > >關於static用法詳細解釋

關於static用法詳細解釋

在C++/C中static用法非常強大, 如果用好會高效提高程式效率;

先列好提綱

一,static 變數:

1,靜態區域性變數:

 靜態區域性變數屬於靜態儲存方式,它具有以下特點:

  (1)靜態區域性變數在函式內定義,但不象自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。生命週期為整個源程式

  (2)靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同,即只能在定義該變數的函式內使用該變數。退出該函式後,儘管該變數還繼續存在,但不能使用它。作用域為此函式

  (3)宣告即為初值為0;所有靜態變數(包括靜態全域性變數、靜態成員變數)的共同特點;這是區別普通變數的一個重要地方;宣告即初始化為0;


  (4)自動變數不賦初值,則其值是不定的。 根據靜態區域性變數的特點, 可以看出它是一種生存期為整個源程式的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用,而且儲存了前次被呼叫後留下的值。 因此,當多次呼叫一個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的副作用,因此仍以採用區域性靜態變數為宜

  2.靜態全域性變數

      (1)作用域為整個源程式;但不可被extern引用到其他檔案,這是區別於普通全域性變數的地方,普通全域性變數可被extern到工程中任意檔案;

      (2)生命週期為整個源程式;

      (3)宣告即為初始化為0;

     (4)和靜態區域性變數重名無衝突,可同時存在;此處呼叫容易產生錯誤,注意呼叫操作;

  全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。應予以注意。

  靜態變數

  除範圍之外,變數還有存活期,在這一期間變數能夠保持它們的值。在應用程式的存活期內一直保持模組級變數和公用變數的值。但是,對於 Dim 宣告的區域性變數以及宣告區域性變數的過程,僅當過程在執行時這些區域性變數才存在。通常,當一個過程執行完畢,它的區域性變數的值就已經不存在,而且變數所佔據的記憶體也被釋放。當下一次執行該過程時,它的所有區域性變數將重新初始化。

  但可將區域性變數定義成靜態的,從而保留變數的值。在過程內部用 Static 關鍵字宣告一個或多個變數,其用法和 Dim 語句完全一樣:

二,static函式:

三,static成員變數:

作用於整個類,從屬於整個類,而不是類的某個物件對於任意此類的某物件,靜態成員變數起到的作用是共享此靜態資料;

四,static成員函式:

五,作用域:、

    靜態區域性作用域在整個函式;靜態全域性作用域在整個原始檔;靜態成員變數整個類而不是某個物件,即沒有物件同樣可以使用

六,生命週期:

     生命週期都是整個原始檔,注意區別不是整個工程;而全域性變數則是整個工程;

七,記憶體分配:

     宣告即為初始化為0或者使用者自定義值,分配記憶體在靜態資料區;

八,程式設計對比體驗:
九,總結:

十,遺留問題: