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使得成員從“屬于類對象”變成了“屬于類,而不屬于類對象”。
對于數據成員:
-
類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指針多態的概念無法踐行。
總結
以上是生活随笔為你收集整理的static关键字总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里合伙人程立:阿里15年,我撕掉了身上
- 下一篇: 史海峰:构建产业互联网金融系统的正确姿势