靜態(tài)變量是為了解決什么問題而存在的?

[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對變量的修飾

  1. 對全局變量的修飾,得到全局靜態(tài)變量,能夠使得其作用域在定義的開始處到文件結(jié)尾。例如在a.c中定義了static int a = 10;那么在b.c中用extern int a是拿不到a的值的,因?yàn)?code>a的作用域只在a.c中。這樣能夠解決文件之間的符號污染問題。

  2. 對局部變量(棧變量)修飾,得到局部靜態(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對類的修飾

  1. static對類成員的修飾,得到了類的靜態(tài)成員。在類中,靜態(tài)成員可以實(shí)現(xiàn)多個對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性,因此靜態(tài)成員是類的所有對象中共享的成員,而不是某個對象的成員,對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象公用。
  1. static對類函數(shù)的修飾,得到了類的靜態(tài)函數(shù)。和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,而不是某個具體對象成員,因此,對于靜態(tài)成員的調(diào)用不需要用對象名。這樣也能減少創(chuàng)建多個對象時的一些不必要的開銷。

可以看到,靜態(tài)變量用處強(qiáng)大!?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容