C 全域性變數和static變數初始化問題

2022-06-22 13:03:13 字數 1208 閱讀 7256

全域性變數、檔案域中的靜態變數、類中的成員靜態變數在main函式執行前初始化;區域性變數中的靜態變數在第一次呼叫時初始化。

c和c++的區別:區域性靜態變數:

在c語言中是編譯期初始化並分配記憶體,故不能用變數給靜態區域性變數賦值,只能用常量。

在c++中是第一次執行時初始化,因為c++引入了物件的概念,物件一般需要建構函式,無法簡單的分配記憶體,故可以用變數賦值,並且在第一次使用時初始化。

初始化又分為靜態和動態:

靜態初始化:

針對用常量來對全域性變數進行初始化的情況,這個變數是簡單的內建型別(不包括含建構函式的複雜類,歸屬於下一項)。例如這裡的a變數。

int a = 3

;class

a;

在程式載入過程中完成。

根據變數是否設定初值分別放於data segment段(設定初值)和bss段(未設定初值)  

動態初始化(執行期)(main函式前,區域性靜態變數除外):

1. 需要經過函式呼叫來完成的初始化。例如這裡的a變數。

int a = foo()

2. 複雜型別的初始化。需要呼叫建構函式。例如這裡的aa變數。

class a

}a aa;

靜態初始化的時機是先於動態初始化的。

使用過類中的靜態成員變數的夥伴都發現了,在類中定義的靜態成員變數,還必須要在類外定義下才可以使用,否則會編譯報錯。

那麼為什麼會出現這種情況呢?

靜態成員變數不屬於任何乙個物件,物件的資料中不應該包含靜態成員的資料。所以在定義類的時候不會給靜態變數分配記憶體只是宣告,因此就要在其他地方分配即定義。

定義與宣告的區別:

宣告:只是向程式表面變數的型別和名字。

定義:為變數分配記憶體,也可以順便初始化。程式中變數有且只有乙個定義(更能說明為什麼要在類外再定義下類的靜態成員變數了)。

對於編譯單元(同乙個檔案)的全域性變數來講,初始化順序跟宣告的順序一致。銷毀順序則相反。

對於不同編譯單元的全域性變數,初始化順序不確定。對於不同編譯單元的全域性變數互相引用的情況應避免。

1)可以通過函式呼叫,引用的時候不直接引用全域性變數,而是放在乙個函式中。函式中的全域性變數在呼叫時初始化。

int 

get_a()

intget_b()

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...

static 變數 全域性變數

一 static 變數 static變數大致分為三種用法 1.用於區域性變數中,成為靜態區域性變數.靜態區域性變數有兩個用法,記憶功能和全域性生存期.2.用於全域性變數,主要作用是限制此全域性變數被其他的檔案呼叫.3.用於類中的成員.表示這個成員是屬於這個類但是不屬於類中任意特定物件 1.靜態區域性...

static 全域性變數 和 普通全域性變數區別

tatic全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?全域性變數 外部變數 的說明之前再冠以static就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上...