[toc]
對這個問題的補(bǔ)充描述如下:
它提供了什么好處?
有什么場景需要使用到它?
我在搜索引擎搜到的都只是說什么語法方便..
還有編譯方面的實(shí)現(xiàn)之類的這些內(nèi)容..
但是我關(guān)心的是 它是為了什么而誕生的?
好!好一個只關(guān)心為了什么而誕生的!說一下c++中的靜態(tài)變量吧!
程序在處理的時候,都是處理數(shù)據(jù),或者稱之為變量。變量的存儲分為動態(tài)存儲和靜態(tài)存儲。靜態(tài)存儲說的是在程序運(yùn)行的整個過程中都存在,而動態(tài)存儲則是在調(diào)用函數(shù)時臨時分配的存儲單元。
這么做的好處顯而易見,有些變量,我就是希望他是全局的,而有些變量,我希望它隨著函數(shù)的調(diào)用而動態(tài)存儲和消亡。C++中來處理“靜態(tài)”這一件事情,用的是static關(guān)鍵字。
對于一個程序,最重要的三大部分就是:變量、函數(shù)、類。從而可以細(xì)分為對全局變量、對局部變量、對函數(shù)、對類成員、對類函數(shù)的五種修飾,從而得到全局靜態(tài)變量、局部靜態(tài)變量、靜態(tài)函數(shù)、類的靜態(tài)成員、類的靜態(tài)函數(shù)。
static對變量的修飾
對全局變量的修飾,得到全局靜態(tài)變量,能夠使得其作用域在定義的開始處到文件結(jié)尾。例如在
a.c中定義了static int a = 10;那么在b.c中用extern int a是拿不到a的值的,因?yàn)?code>a的作用域只在a.c中。這樣能夠解決文件之間的符號污染問題。對局部變量(棧變量)修飾,得到局部靜態(tài)變量,將棧變量生命周期延長到程序執(zhí)行結(jié)束時。 也就是說局部靜態(tài)變量的作用域仍然是在這個函數(shù)所定義的局部作用域,離開定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時,它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。未經(jīng)初始化的局部靜態(tài)變量,會被自動初始化為
0。(普通的局部變量分配在棧上,如果沒有給定初始化的值的話,會分配一個隨機(jī)值,并且會隨著函數(shù)棧幀的釋放而被釋放掉。)。這么做的用意在于,對于某些局部變量,我們可以保留并使用一些需要的信息,比如記錄這個函數(shù)被調(diào)用了多少次。
static對函數(shù)的修飾
??在函數(shù)返回值類型前加static,函數(shù)就定義為靜態(tài)函數(shù)。函數(shù)的定義和聲明在默認(rèn)情況下都是extern的,但如果用static修飾的話,與static修飾全局變量一樣,靜態(tài)函數(shù)只能在聲明它的文件中可見,不能被其它文件調(diào)用。也不會與其它cpp中的同名函數(shù)引起沖突。
static對類的修飾
-
static對類成員的修飾,得到了類的靜態(tài)成員。在類中,靜態(tài)成員可以實(shí)現(xiàn)多個對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性,因此靜態(tài)成員是類的所有對象中共享的成員,而不是某個對象的成員,對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象公用。
-
static對類函數(shù)的修飾,得到了類的靜態(tài)函數(shù)。和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,而不是某個具體對象成員,因此,對于靜態(tài)成員的調(diào)用不需要用對象名。這樣也能減少創(chuàng)建多個對象時的一些不必要的開銷。
可以看到,靜態(tài)變量用處強(qiáng)大!?。?!