static關鍵字總結

轉載自:https://www.cnblogs.com/lpxblog/p/5190463.html

static,即靜態聲明。它在 作用域、存儲方式、生命週期 等各方面影響一個變量或函數。文章將從 局部變量、全局變量、普通函數、類的static成員(包括數據成員與成員函數)來總結static。

  • 全局變量

    所有的全局變量,無論是否是static的,都是存儲於靜態存儲區的。全局變量本身就是靜態存儲方式,將全局變量聲明爲static是爲了將變量的作用域限制在本翻譯單元中(本源文件中),使該全局變量不能被源程序的其他翻譯單元所引用。普通全局變量使用extren聲明可以拓展其作用域至其他翻譯單元中。

    可以總結爲:static改變了全局變量的作用域,而不改變變量的存儲位置與生命週期。

  • 局部變量

    局部變量即在函數內定義的或在塊中定義的變量。static對局部變量的作用不同於全局變量。普通局部變量在離開其作用域(如離開定義它的函數或塊的花括號)時即消失,而static變量卻存在於程序運行的整個過程,也即是說,static聲明改變了局部變量的生命週期。普通局部變量是存儲在動態存儲區的(堆),而static局部變量是存儲在靜態存儲區,因而普通局部變量在函數每次被調用時都被重新分配內存地址,而靜態局部變量則在程序運行過程中佔據固定的內存。

    可以總結爲:static改變了局部變量的存儲方式與生命週期,而不改變變量的作用域。

  • 普通函數

    這裏的普通函數是爲了與類的成員函數區別開來。函數在定義時默認是外部的,通過extren聲明即可被其他源文件引用,static聲明將函數的作用域限制在本翻譯單元中,成爲內部函數。static函數在內存中只有一份,普通函數在每個調用中維持一份拷貝。

    可以總結爲:static使得函數在內存中只有一份,並將函數作用域限制在當前源文件。

另外,static有幾個優點總被提起:

1. 避免了鏈接時與其他源文件中的變量命名引起衝突。
2. 對於c函數而言,static對函數進行了信息屏蔽,只給當前文件中其他函數使用。

  • 類static成員

    static聲明對類成員的作用可以這樣概括:static使得成員從“屬於類對象”變成了“屬於類,而不屬於類對象”。

    對於數據成員

  1. static數據成員必須在類定義體的外部進行定義。
class BOOK
{
    private:
        //折扣
        static float discount;
};
//在類定義體外部定義並初始化
float BOOK::discount = 0.95f;
  1. 不像普通數據成員,static數據成員不能在構造函數中進行初始化。正如上面所說,它只能在類外部定義並初始化。然而有一個例外,整型的const static 數據成員可以在類的定義體中進行初始化。但需注意的是,const static數據成員在類的定義體中初始化時,該數據成員仍必須在類的定義體之外進行定義(不必再指定初始值了)。
class BOOK
{
    private:
        //折扣
        const static  int  discount=1;
};
const  int BOOK::discount;
  • 類static成員函數

    在類內部聲明的static成員函數,在類定義體外部進行定義時無須重複指定static關鍵字。

    對於static成員函數,它同樣是不屬於類對象的,因而它沒有this指針。它可以直接訪問類的static數據成員,不能直接使用非static成員,原因是非static數據成員屬於類對象,使用非static數據成員時必須通過this指針來確定是這些成員屬於哪個類對象,然而上面說了,static成員函數沒有this指針。

    static成員函數不能被聲明爲const。實際上,成員函數被聲明爲const的本質是它向編譯器保證不會通過這個函數來修改類對象在內存中的每一個bit的內容(可以看《effective C++》 條款03 “儘可能使用const” ),然而我們知道,static成員函數並不屬於類對象,更談不上要保證不修改某一對象的內存了。

    另外,虛函數不能爲聲明爲static,爲什麼呢?原因還是static成員函數沒有this指針。virtual funtion運行時綁定是多態的基礎,沒有this指針多態的概念無法踐行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章