1. 程式人生 > >C++ Static

C++ Static

前言 全局變量 過程 不變 查找 智能指針 itl 全局靜態變量 圖片

前言

今天看到static關鍵字,對其朦朦朧朧的,所以專門查找了一下相關的定義和說明來深入理解
參考文章 : C/C++中STATIC用法總結

使用Static的作用主要有兩種:

  1. 第一個作用是限定作用域
  2. 第二個作用是保持變量內容持久化

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