C++避坑---關(guān)鍵字static的使用及注意事項(xiàng)

static
關(guān)鍵字可用于聲明變量、函數(shù)、類數(shù)據(jù)成員和類函數(shù)。其主要影響著它們的生命周期、作用域和存儲位置。
static在普通變量和函數(shù)中的使用
static修飾局部變量
默認(rèn)情況下static修飾后作用域函數(shù)內(nèi)部函數(shù)內(nèi)部存儲位置棧靜態(tài)區(qū)生命周期局部(函數(shù)調(diào)用開始,函數(shù)執(zhí)行完成時結(jié)束)全局(函數(shù)調(diào)用開始,到程序執(zhí)行完成時結(jié)束)
默認(rèn)情況下,局部變量(定義在函數(shù)內(nèi)部的變量)的作用域僅限于函數(shù)內(nèi)部,只有函數(shù)被調(diào)用的時候才被初始化(存儲于棧空間)和使用,函數(shù)執(zhí)行完畢的時候被釋放,而被
static
修飾后,其作用域不變,但是存儲位置變?yōu)殪o態(tài)區(qū),且生命周期延長(直到程序運(yùn)行結(jié)束后才被釋放)。
?
輸出結(jié)果為:
static修飾全局變量
默認(rèn)情況下static修飾后作用域整個程序當(dāng)前文件存儲位置靜態(tài)區(qū)靜態(tài)區(qū)生命周期全局全局
默認(rèn)情況下,全局變量(在所有塊的外部定義變量)的作用域是整個程序,存儲位置為靜態(tài)區(qū),生命周期也與程序的生命周期相同。當(dāng)其被
static
修飾后,其存儲位置和生命周期不會改變,但其作用域變?yōu)楫?dāng)前文件。
static修飾函數(shù)
static
修飾函數(shù)的作用與修飾全局變量的作用類似,即將函數(shù)的作用域由整個程序變?yōu)楫?dāng)前文件。
static在類中的使用
在類定義中,關(guān)鍵字static
聲明不綁定到類的實(shí)例對象。static
在類中常用的使用場景主要有:
修飾類的數(shù)據(jù)成員:即靜態(tài)成員,該成員不關(guān)聯(lián)到任何對象,即使不定義該類的任何對象它也存在,其生存周期大于該類的對象,其作為類的成員,由該類的所有對象共同訪問。靜態(tài)成員存儲于全局?jǐn)?shù)據(jù)區(qū),由于要給靜態(tài)成員分配空間,因此普通的靜態(tài)成員不能在類的聲明中定義。其定義以及使用方法如下:
??
修飾類的成員函數(shù):即靜態(tài)成員函數(shù),該函數(shù)與靜態(tài)成員一樣,不關(guān)聯(lián)到任何對象。調(diào)用時,它們沒有
this
指針。靜態(tài)成員函數(shù)不能是virtual
、const
或volatile
的。靜態(tài)成員函數(shù)的地址可以存儲在常規(guī)的函數(shù)指針中,但不能存儲在成員函數(shù)指針中。其定義及使用方法如下:
介紹完static
的使用方式和方法后,我們通過一個完整的例子,總結(jié)一下其使用時的注意事項(xiàng),例子如下:
輸出結(jié)果如下:
從上述例子和輸出結(jié)果可以得出:
靜態(tài)數(shù)據(jù)成員不關(guān)聯(lián)到類對象,且只初始化一次,單獨(dú)存儲。
普通的靜態(tài)成員不能在類的聲明中定義,需要在類的外面單獨(dú)初始化。
靜態(tài)成員函數(shù)能夠訪問靜態(tài)成員,但不能訪問非靜態(tài)數(shù)據(jù)成員和非靜態(tài)成員函數(shù)(因?yàn)榉庆o態(tài)數(shù)據(jù)成員和函數(shù)是與類的對象綁定的,但靜態(tài)成員函數(shù)不關(guān)聯(lián)任何對象,且調(diào)用時,它們沒有
this
指針。)。
總 結(jié)
在使用關(guān)鍵字static
的時候,我們需要注意一下幾個原則:
被
static
修飾的變量的存儲位置都在靜態(tài)區(qū),且生命周期延長至整個程序運(yùn)行結(jié)束。static
具有隔離作用,被static修飾的全局變量和全局函數(shù)的作用域由全局變?yōu)楫?dāng)前文件。靜態(tài)變量雖然具有全局變量的生命周期,但只能作用于自己的作用域。
普通靜態(tài)成員需要在類的外面進(jìn)行初始化。
靜態(tài)成員函數(shù)不能調(diào)用類的非靜態(tài)成員,包括非靜態(tài)成員和非靜態(tài)成員函數(shù)。
參考文獻(xiàn)
《C++ reference》
文章首發(fā)公眾號:iDoitnow 如果喜歡話,可以關(guān)注一下