全局變量必須初始化嗎 的靜態(tài)成員變量為什么一定要初始化?
的靜態(tài)成員變量為什么一定要初始化?我們知道C類的靜態(tài)成員變量需要初始化,但是為什么要初始化呢。實(shí)際上,“靜態(tài)成員變量需要初始化”這句話有一些問題。應(yīng)該說“靜態(tài)成員變量需要定義”是準(zhǔn)確的,而不是初始化。
的靜態(tài)成員變量為什么一定要初始化?
我們知道C類的靜態(tài)成員變量需要初始化,但是為什么要初始化呢。實(shí)際上,“靜態(tài)成員變量需要初始化”這句話有一些問題。應(yīng)該說“靜態(tài)成員變量需要定義”是準(zhǔn)確的,而不是初始化。兩者的區(qū)別在于初始化是分配一個(gè)初始值,而定義是分配內(nèi)存。靜態(tài)成員變量只在類中聲明,而沒有定義,因此在類外定義它們實(shí)際上是為靜態(tài)成員變量分配內(nèi)存。
如何初始化一個(gè)類中的靜態(tài)成員變量?
如果我們不考慮父類,我們可以先進(jìn)行靜態(tài)初始化,然后進(jìn)行非靜態(tài)初始化。
靜態(tài)初始化包括靜態(tài)成員變量和靜態(tài)塊的初始化。實(shí)際上,靜態(tài)塊在編譯期間是集中的。
非靜態(tài)初始化包括非靜態(tài)成員變量初始化、非靜態(tài)塊和構(gòu)造方法,編譯后集中在構(gòu)造方法中。
如果沒有相互通話,那就非常簡單了。首先,靜態(tài)初始化。如果在靜態(tài)初始化過程中調(diào)用了后者呢?!你可以編寫一個(gè)代碼來測(cè)試它:
輸出:
你可以先看到它確實(shí)是靜態(tài)初始化,但是中間有對(duì)構(gòu)造方法的調(diào)用。
雖然編譯器不報(bào)告錯(cuò)誤,但此調(diào)用實(shí)際上是有風(fēng)險(xiǎn)的。
由于靜態(tài)成員變量(如果已設(shè)置)在初始化之前調(diào)用類構(gòu)造函數(shù)(假設(shè)存在依賴關(guān)系),因此該過程實(shí)際上是不可控制的。
看看這個(gè)例子:你能想象這種輸出嗎?
因此,如果必須在靜態(tài)初始化過程中調(diào)用此類的構(gòu)造函數(shù)。
一定要注意初始化順序,準(zhǔn)確到語句。
c 中定義一個(gè)變量一定要賦初值嗎?
不一定。是否分配初始值根據(jù)編程的實(shí)際需要確定。1對(duì)于全局變量和局部靜態(tài)變量,如果沒有初始化值,則默認(rèn)值為0。因此,當(dāng)這類變量的初值要求為0,或者不考慮初值時(shí),在定義時(shí)不需要賦初值,這樣可以提高效率。2對(duì)于局部變量,如果沒有初始值,那么默認(rèn)值是隨機(jī)的,即任何值都是可能的。對(duì)于這類變量,如果其初始值不重要,或者不會(huì)影響程序的結(jié)果,例如定義后,下一步就是輸入代碼從其他通道獲取值,那么初始值就不能賦值。
變量必須初始化嗎?
不。變量在使用前應(yīng)給定一個(gè)值。一個(gè)好的編譯器將幫助您在給定值之前找到所使用的變量。但是,變量不必初始化。在程序顯式初始化之前,在函數(shù)外部或函數(shù)內(nèi)部使用static關(guān)鍵字定義的變量(在數(shù)據(jù)部分中定義的變量,請(qǐng)參見2.1)已由系統(tǒng)初始化為0。在沒有static關(guān)鍵字的函數(shù)或程序塊中定義的變量是自動(dòng)變量。如果不顯式初始化這些變量,它們將具有未定義的值。如果不初始化自動(dòng)變量,則必須確保在使用它之前為它賦值。通過調(diào)用malloc()函數(shù)從堆中分配的空間也包含未定義的數(shù)據(jù),因此在使用它之前必須對(duì)其進(jìn)行初始化,但是通過調(diào)用calloc()函數(shù)分配的空間已初始化為0。