C++ Static
前言
今天看到static關鍵字,對其朦朦朧朧的,所以專門查找了一下相關的定義和說明來深入理解
參考文章 : C/C++中STATIC用法總結
使用Static的作用主要有兩種:
- 第一個作用是限定作用域
- 第二個作用是保持變量內容持久化
c中static的用法:
1. 全局靜態變量
用法: 在全局變量前加上關鍵字static,全局變量就定義成一個全局的靜態變量。
內存中的位置:靜態存儲區,整個程序運行過程中一直存在
作用域:全局靜態變量在聲明它的文件之外是不可見的,也就是說作用在聲明所在的文件中
2. 局部靜態變量
在局部變量之前加上關鍵字static,局部變量就成為一個局部靜態變量
內存中的位置:靜態存儲區
初始化:未經過初始化的全局靜態局部變量會自動初始化為0
作用域:作用域仍然為局部作用域,當定義它的函數或者語句塊結束的時候,作用域結束。當局部靜態變量離開作用域之後,並沒有銷毀,而是仍然駐留在內存當中,只不過我們不能對它進行訪問,之道函數再次調用的時候,值依然保持不變。
C++中static的用法
類的靜態成員
class A
{
private:
static int value;
}
在Cpp中必須對靜態變量進行初始化,
初始化時,使用作用域運算符來標明其所屬的類,其屬於所有成員共有,只有一個拷貝。
類的靜態函數
class A
{
private:
static int func(int x);
}
實現的時候也不需要static的修飾,因為static是聲明性關鍵字;
類的靜態函數是該類的範疇內的全局函數,不能訪問類的私有成員,只能訪問類的靜態成員,不需要類的實例即可調用;
實際上,他就是增加了類的訪問權限的全局函數;
void A::func(int);
靜態成員函數可以繼承和覆蓋,但無法是虛函數;
只在cpp內有效的全局變量:
在cpp文件的全局範圍內聲明:
static int val = 0;
這個變量的含義是該cpp內有效,但是其他的cpp文件不能訪問這個變量;如果有兩個cpp文件聲明了同名的全局靜態變量,那麽他們實際上是獨立的兩個變量;
只在cpp內有效的全局函數:
函數的實現使用static修飾,那麽這個函數只可在本cpp內使用,不會同其他cpp中的同名函數引起沖突;
warning:不要再頭文件中聲明static的全局函數,不要在cpp內聲明非static的全局函數,如果你要在多個cpp中復用該函數,就把它的聲明提到頭文件裏去,否則cpp內部聲明需加上static修飾;
智能指針下的static
這裏使用GetMyType()
的操作,通過Static的方式來獲取智能指針
測試發現,使用靜態變量後,Get的操作都是相同的內容,而且Type只創建了一次。
由於類中使用了靜態變量,所以類只有程序退出的時候才會完全析構。
來自為知筆記(Wiz)
C++ Static