天天看點

static

static是c++中很常用的修飾符,它被用來控制變量的存儲方式和可見性。

函數内部定義的變量,在程式執行到它的定義處時,編譯器為它在棧上配置設定空間,大家知道,函數在棧上配置設定的空間在此函數執行結束時會釋放掉,這樣就産生了一個問題: 如果想将函數中此變量的值儲存至下一次調用時,如何實作? 最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點(破壞了此變量的通路範圍,使得在此函數中定義的變量,不僅僅受此函數控制)。

需要一個資料對象為整個類而非某個對象服務,同時又力求不破壞類的封裝性,即要求此成員隐藏在類的内部,對外不可見,此時則要使用static。

機制:

1.靜态資料成員要在程式一開始運作時就必須存在。因為函數在程式運作中被調用,是以靜态資料成員不能在任何函數内配置設定空間和初始化。

2.它的空間配置設定有三個可能的地方,一是作為類的外部接口的頭檔案,那裡有類聲明;二是類定義的内部實作,那裡有類的成員函數定義;三是應用程式的main()函數前的全局資料聲明和定義處。

3.靜态資料成員要實際地配置設定空間,故不能在類的聲明中定義(隻能聲明資料成員)。類聲明隻聲明一個類的大小,并不進行實際的記憶體配置設定,是以在類聲明中寫成定義是錯誤的。它也不能在頭檔案中類聲明的外部定義,因為那會造成在多個使用該類的源檔案中,對其重複定義。

4.static被引入以告知編譯器,将變量存儲在程式的靜态存儲區而非棧上空間,靜态資料成員按定義出現的先後順序依次初始化。當靜态成員嵌套時,要保證所嵌套的成員已經初始化了。消除時的順序是初始化的反順序。

static的優點在于:可以節省記憶體,因為它是所有對象所公有的,是以,對多個對象來說,靜态資料成員隻存儲一處,供所有對象共用。靜态資料成員的值對每個對象都是一樣,但它的值是可以更新的。隻要對靜态資料成員的值更新一次,保證所有對象存取更新後的相同的值,這樣可以提高時間效率。