C++ static

    先說一下C語言中的static,然後接着說C++中的static。

C語言中的static作用:

1.修飾變量:static關鍵字用於修改標識符的鏈接屬性,從external改爲internal,但標識符的存儲類型和作用域不受影響,會延長它的生存週期static修飾全局變量,全局變量具有外延性,被static修飾後,作用域僅限制在本文件,不能在其它文件中訪問,即便是extern外部聲明也不可以,他們都是程序運行結束後才釋放。

2.修飾函數:加在函數定義或聲明的前面,會限制函數作用域到文件作用域。

C++中static作用:

    在C++中,關鍵字static除了繼續保持上面的特性外,還可以用來修飾類的成員變量和成員函數,使之成爲靜態成員變量和靜態成員函數,統稱爲靜態成員。

靜態數據成員 :

  1. 靜態數據成員可以實現多個對象之間的數據共享,它是類的所有對象的共享成員,它在內存中只佔一份空間,如果改變它的值,則各對象中這個數據成員的值都被改變。 
  2. 靜態數據成員是在程序開始運行時被分配空間,到程序結束之後才釋放,只要類中指定了靜態數據成員,即使不定義對象,也會爲靜態數據成員分配空間。 
  3. 靜態數據成員可以被初始化,但是只能在類體外進行初始化(類內定義,類外初始化,type 類名::變量名=初值)。
  4. 靜態數據成員既可以通過對象名引用,也可以通過類名引用。

靜態成員函數 :

  1. 靜態成員函數和靜態數據成員一樣,他們都屬於類的靜態成員,而不是對象成員。 
  2. 非靜態成員函數有this指針,而靜態成員函數沒有this指針,所以靜態對象不能直接調用非靜態成員函數。
  3. static 修飾成員函數,它的作用只有一個,用於管理static成員。
  4. 靜態成員函數主要用來訪問靜態數據成員而不能直接訪問非靜態成員。

需要注意的幾點:

    (1)sizeof不將靜態成員變量的大小計算在內,例如:

class Test
{
    private:
        int value;
        static int count;
};
int Test::count=0;
int main(int argc, char *argv[])
{
    Test t;
    cout<<"sizeof(Test) = "<<sizeof(Test)<<endl;
}

運行結果:sizeof(Test) = 4,驗證了sizeof運算符不會將靜態成員變量的大小計算在內。另外,在使用靜態變量成員的時候不進行初始化,鏈接的時候會出錯。

    (2)靜態成員是屬於類的,而不是屬於某個對象的,即便沒有一個實例,類的靜態成員變量也已經存在了,因此靜態變量除了能夠和普通成員一樣通過對象訪問外,還可以通過類名訪問,訪問形式爲    類名::成員名。同時靜態成員受到private、public等的限制,因此,在類外通過類名訪問時,需要其訪問權限爲public。

    (3)靜態成員函數不能直接訪問類的非靜態成員

    由於靜態成員函數屬於整個類,在類實例化對象之前就已經分配空間了,而類的非靜態成員必須在類實例化對象後纔有內存空間,因此在靜態成員函數中直接訪問非靜態成員變量或者直接調用非靜態成員函數就會出錯。

    


發佈了274 篇原創文章 · 獲贊 50 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章