C C 中的static關鍵字

2021-09-24 11:58:56 字數 3238 閱讀 4412

static的用法主要分為兩大類,一種是在c語言中的用法,還有就是c++在類中的用法。

2. 在c++中

定義靜態全域性變數就是在全域性變數前加上 static 關鍵字

#include

static

int a =10;

//這是靜態全域性變數

靜態全域性資料的特點:

1、靜態全域性變數就在全域性資料段分配記憶體。

2、靜態資料如果不初始化會被自動初始化為0

3、靜態全域性變數在宣告它的整個檔案都是可見的,在其他檔案中不可見,它和extern的作用相反

static 的第三個特點還有個好處,就是可以防止命名汙染,不用擔心在別的檔案中重複定義乙個變數。

static 修飾的區域性變數就是靜態區域性變數。靜態區域性變數和靜態全域性變數的共同點就是都是在全域性資料區分配記憶體的。

區域性變數的特點:

1、在全域性資料區分配記憶體

2、靜態區域性變數在宣告時初始化,如果使用者沒初始化,那麼初值也會被初始化為0

3、當程式執行到區域性變數的宣告位置時被首次初始化,後面的函式再呼叫時不會初始化

4、它的作用域是區域性的,只作用於該函式中,但是它的生命週期已經變為隨程式了。因為它在全域性資料區分配,所以生命週期變為整個程式,但出了函式範圍,作用域結束。

舉個栗子:

#include

int i =1;

void

fun(

)int

main()

看起來每次執行函式都有初始化語句,但是static的作用就是只是在第一次宣告的時候初始化,後面再次呼叫函式的時候,變數不會被初始化,對於這個函式變數會隨著函式的呼叫次數而改變,所以結果如下:

在函式的返回型別前面加上 static 關鍵字就是靜態函式了。

靜態函式和普通函式的最大區別就是靜態函式只能被本檔案可見,不能被別的檔案呼叫。這樣也可以防止函式命名衝突。

#include

static

void

fun(

)//靜態函式

intmain()

在 c++ 中,和c語言中不同的是c++對類成員進行的修飾。

宣告為 static 的類成員就是類的靜態成員,分別是靜態成員變數和靜態成員函式。

static修飾的成員變數就是靜態成員變數;

static修飾的成員函式就是靜態成員函式。

class

test

;int test::_count =0;

//類外初始化

intmain()

類中的靜態成員變數一定要在類外初始化,在類內直接初始化會報錯;

為什麼在類內初始化會報錯?

答:因為程式中如果沒有建立物件的話,定義類的**是不會生成的。所以我們對乙個不存在的東西賦值當然會報錯!!

靜態成員變數的特點:1、類中靜態成員為所有類物件所共享,不屬於某個具體的例項,即靜態成員變數只分配一次記憶體,供所有物件公用;2、類中靜態成員變數必須在類外定義,定義時不加 static 關鍵字;

3、類中靜態成員變數的訪問是通過【類名::靜態成員變數】或【物件.靜態成員變數】的方式來訪問

4、類中靜態成員變數也遵循 public、protected、private 的訪問許可權,以及 const 修飾符等;

5、類中靜態成員變數是在全域性資料區分配記憶體,不屬於某乙個類物件,而是屬於本類所有的類物件,所以即便沒有例項化物件,也可以通過【類名::靜態成員變數】的方式訪問.

6、應用場景:可以用於多個類具有相同的屬性時,當所有類的這個屬性都要更改時,那麼只需要更改一處即可,而且靜態成員變數只在全域性資料區儲存乙份,更省空間。

靜態成員變數和全域性資料比較:

靜態成員變數可以是private屬性,而全域性變數不可以,所以全域性變數一定程度破壞了封裝

靜態成員變數也可以減少命名衝突。

靜態成員函式的特性:1、類中靜態成員函式的訪問是通過【類名::靜態成員變數】或【物件.靜態成員變數】的方式來訪問2、類中靜態成員函式也遵循 public、protected、private 的訪問許可權,也可以具有返回值以及 const 修飾符等;

3、類中靜態成員函式中沒有 this 指標,所以不能訪問非靜態成員函式,就因為它不是屬於任何乙個物件,所以沒有this指標;

4、沒有this指標,靜態成員函式與全域性函式相比效率會少許增長。

類中的函式一般都是有乙個隱含的 this 指標,this指標指向類的物件本身,所以呼叫函式一般這樣寫fun();實際上是this->fun();

函式的呼叫:

classa}

;int

main()

【問題1】:類的靜態函式可以呼叫非靜態函式嗎?

答:不可以,靜態成員函式之間可以互相訪問,包括靜態成員函式和靜態成員變數。

因為在靜態成員函式中呼叫非靜態成員函式實際上要傳引數,傳this指標,但是靜態函式並沒有this指標,所以不能調。看看這段**:

class

test

void

memfoo()

}int

main()

以上是c++**,翻譯成c**:

struct test

static

void

test_staticfoo()

void

memfoo

(test* pthis)

intmain()

【問題2】:非靜態函式可以呼叫類的靜態函式嗎?

答:可以,非靜態函式可以隨意的訪問類的靜態成員函式和靜態成員變數。

C C 中的static關鍵字

關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數只能被定義該變數的函式所識別,但是不同於自動變數的是,static變數在其函式被呼叫退出後,仍保留其值。下次函式被呼叫時,可以訪問最近一次被修改後的值。static變數的宣告方法如下 static in...

C C 中的static關鍵字

原理 預設的變數和函式名在編譯成彙編 s檔案後,會有.globl func name,globl指示告訴彙編器,func name這個符號要被鏈結器用到 彙編檔案在經過彙編器處理成二進位制的.o檔案時,符號會被變數或函式實際的位址值代替 所以要在目標檔案的符號表中標記它是乙個全域性符號。如果乙個變數...

C C 的static關鍵字

static主要有三個作用 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 前兩種c和c 都有,第三種僅在c 中有,下面分別作以下介紹 一 區域性靜態變數 在c c 中,區域性變數按照儲存形式可分為三種auto,static,register。其中register不常用到,下...