C89:論靜態(static)

一.簡介

Const修飾的類型跟它自己的內存值有關,而Static修飾的類型跟它內存生命週期有關多線程

只用於本文件的函數要所有使用static關鍵字聲明,這是一個良好的編碼風格

(1)對其餘源文件隱藏

(2)保持變量內存的持久,保持惟一性,只佔一分內存

(3)默認初始化爲0
函數

注意:形參不能被static修飾this

 

  • 規則:

規則1:普通局部變量用完就釋放,因此當咱們須要屢次用到同一份變量數據的時候,就能夠用static來留住這個變量的數據編碼

 

 

 

二.用於C代碼

(1)修飾局部變量

保持內存的持久(保持惟一性,只佔一分內存)spa

規則1:普通局部變量用完就釋放,因此當咱們須要屢次用到同一份變量數據的時候,就能夠用static來留住這個變量的數據線程

void A(){
     
    //普通局部變量存儲於進程棧空間,使用完畢後會當即釋放
    //靜態局部變量編譯器會默認初始化爲0,存儲於進程的全局數據區,程序結束時釋放
    static int a=1;
}

 

(2)修飾全局變量

對其餘源文件隱藏指針

規則2:全局變量可能會致使多線程競爭同一份數據,用static能夠把變量留住在單一源文件裏面使用code

//全局變量自己就有內存的持久性,因此靜態全局變量用於在其餘源文件屏蔽該變量
  
//全局變量定義在函數體外部,在全局數據區分配存儲空間,且編譯器會自動對其初始化
//普通全局變量對整個工程可見,其餘文件可使用extern外部聲明後直接使用,也就是說其餘文件不能定義一個同名的變量
//靜態全局變量僅對其當前文件可見,其餘文件不可訪問,其餘文件能夠擁有同名的變量
  
  
//file1.cpp
int varA;
static int varB;
  
//file2.cpp
extern int varA;        //使用其餘源文件的全局變量
extern int varB;        //錯誤,靜態全局變量被屏蔽

 

(3)修飾全局函數

對其餘源文件隱藏對象

規則3:blog

//非靜態函數能夠在另外一個文件中直接引用沒必要加extern聲明
//靜態函數只能在聲明它的文件中可見,其餘文件不能引用該函數
//不一樣的文件可使用相同名字的靜態函數
  
//file1.cpp
  
extern void funA(){}
static void funB(){}
  
//file2.cpp
  
extern void funA();    //使用其餘源文件的全局變量
extern void funB();    //錯誤,靜態全局函數屏蔽了該函數

 

三.用於C++代碼

非靜態成員可以訪問靜態成員,由於生命週期還在.

靜態成員不能訪問非靜態成員

(1)修飾類的靜態成員變量

默認初始化爲0,保持內存的持久(保持惟一性,只佔一分內存),不存在this指針

//靜態成員能夠獨立訪問,無須建立任何對象實例就能夠訪問
//靜態成員變量每一個class只有一份變量內存(全局數據區/靜態區),而普通成員函數每一個對象都有不一樣的變量內存
  
//test.h
class A{
    private:
        static const int a;
}
  
//test.cpp
const int A::a=1;    //不受private和protected訪問限制

 

(2)修飾類的靜態成員函數

保持內存的持久(保持惟一性,只佔一分內存)

 

//類的靜態成員函數沒法調用類的非靜態成員函數和變量,由於靜態成員函數沒有this指針
//類的非靜態成員函數能夠調用類的靜態成員函數和變量
//靜態成員函數不能夠同時聲明爲virtual const volatile函數
  
class A{
    public:
        virtual static void fun1();    //錯誤
        static void fun2() const;      //錯誤
        static void fun2() volatile;   //錯誤
};
相關文章
相關標籤/搜索