1. 程式人生 > >C++中static關鍵字的作用

C++中static關鍵字的作用

static的作用主要有兩個方面:

  1. 限定作用域;
  2. 保持變數內容持久化。

static關鍵字在C++中的用法:

  1. 只在cpp內有效的全域性變數:

在cpp檔案的全域性範圍內宣告:

  static int val = 0;

這個變數的含義是該cpp內有效,但是其他的cpp檔案不能訪問這個變數;如果有兩個cpp檔案聲明瞭同名的全域性靜態變數,那麼他們實際上是獨立的兩個變數;

  1. 只在cpp內有效的全域性函式:

函式的實現使用static修飾,那麼這個函式只可在本cpp內使用,不會同其他cpp中的同名函式引起衝突; warning: 不要再標頭檔案中宣告static的全域性函式,不要在cpp內宣告非static的全域性函式,如果你要在多個cpp中複用該函式,就把它的宣告提到標頭檔案裡去,否則cpp內部宣告需加上static修飾;

  1. 保持變數內容的持久(static變數中的記憶功能和全域性生存期)

儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。雖然這種用法不常見。

PS:如果作為static區域性變數在函式內定義,它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還繼續存在,但不能使用它。

例如:

#include <stdio.h>
int fun(){
    static int count = 10; //在第一次進入這個函式的時候,變數a被初始化為10!並接著自減1,以後每次進入該函式,a
    return count--; //就不會被再次初始化了,僅進行自減1的操作;在static發明前,要達到同樣的功能,則只能使用全域性變數:     
} 
int count = 1;
int main(void)
{
     printf("global\t\tlocal static\n");
     for(; count <= 10; ++count)
               printf("%d\t\t%d\n", count, fun());
     return 0;
}

程式的執行結果是:

global  local static

1 10

2 9

3 8

4 7

5 6

6 5

7 4

8 3

9 2

10 1
  1. 預設初始化為0(static變數)

其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然後把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把一個字元陣列當字串來用,但又覺得每次在字元陣列末尾加‘\0’;太麻煩。如果把字串定義成靜態的,就省去了這個麻煩,因為那裡本來就是‘\0’;不妨做個小實驗驗證一下。

#include <stdio.h>
int a;
int main()
{
     int i;
     static char str[10];
     printf("integer: %d; string: (begin)%s(end)", a, str);
     return 0;
}

程式執行的結果是:

integer: 0; string: (begin) (end) 

最後對static的前4條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備永續性和預設值0.

  1. C++中的類成員宣告static

Reference: