C/C++中STATIC用法總結

static的做用主要有兩種:

限定做用域
保持變量內容持久化html

c語言中static的用法

全局靜態變量 :

用法:在全局變量前加上關鍵字static,全局變量就定義成一個全局靜態變量。c++

static int temp;

內存中的位置:靜態存儲區,在整個程序運行期間一直存在。
初始化:未經初始化的全局靜態變量會被自動初始化爲0(自動對象的值是任意的,除非他被顯式初始化)。
做用域:全局靜態變量在聲明他的文件以外是不可見的,準確地說是從定義之處開始,到文件結尾。函數

局部靜態變量:

用法:在局部變量以前加上關鍵字static,局部變量就成爲一個局部靜態變量。.net

func(void) {
    static int temp;
}

內存中的位置:靜態存儲區
初始化:未經初始化的全局靜態變量會被自動初始化爲0(自動對象的值是任意的,除非他被顯式初始化)。
做用域:做用域仍爲局部做用域,當定義它的函數或者語句塊結束的時候,做用域結束。可是當局部靜態變量離開做用域後,並無銷燬,而是仍然駐留在內存當中,只不過咱們不能再對它進行訪問,直到該函數再次被調用,而且值不變。code

靜態函數:

用法:在函數返回類型前加關鍵字static,函數就定義成靜態函數(函數的定義和生命在默認狀況下都是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其餘文件所用)。htm

satic void func() {
}

做用域:只在聲明該函數的文件中可見。對象

c++中static的用法

類的靜態成員:

用法:類聲明中在成員變量前加static,該成員就成爲類的靜態成員。blog

class A{
  private:
    static int val;

};

內存中的位置:靜態存儲區。
初始化:不能在類定義體中(class中)和定義類的頭文件中初始化,能夠在類方法的實現文件(cpp文件)中初始化,且初始化時不用加static關鍵字(緣由:若是在類體或者頭文件中初始化static成員,容易致使頭文件屢次包含時,成員被屢次建立/初始化,違背c++中one definition rule!)。
做用域:全部能夠訪問該類的位置。能夠經過類名直接訪問public 靜態成員;能夠經過對象名訪問public靜態成員;靜態成員函數能夠直接訪問靜態成員變量。繼承

注意:static const 型靜態成員能夠在類定義體中(class中)初始化。內存

類的靜態成員函數:

用法:類聲明中在成員函數前加static,該成員函數就成爲類的靜態成員函數。

class A{
  private:
    static int func(int x);

};

若是在cpp文件中實現,實現的時候也不須要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修飾.

參考:

http://www.javashuo.com/article/p-opugyjzl-ge.html
https://www.cnblogs.com/lvxiaoning/p/7598062.html
http://blog.csdn.net/liujianfei526/article/details/50562881
http://www.runoob.com/cplusplus/cpp-static-members.html
http://bbs.csdn.net/topics/390649283

相關文章
相關標籤/搜索