C++知識分享:靜態(tài)成員變量,你弄懂了嗎?
C++的static關(guān)鍵字可修飾類成員變量/方法,表示變量/方法不從屬于特定對象,而是屬于類的。仔細琢磨靜態(tài)成員變量,會發(fā)現(xiàn)其與C++的方式既相容也矛盾,具有特殊性。

先說相容的一面?!/C++·有聲明和定義的說法:聲明給出簽名,定義給出具體實現(xiàn)。對類型而言,聲明不一定能知道其對象占用空間大小,但根據(jù)定義肯定能確定內(nèi)存占用。說靜態(tài)成員與C++方式是相容的,因為其初始化方式與方法的定義一致。下面是一個例子:

相對于相容點,靜態(tài)成員變量更多展現(xiàn)出怪異的一面,以下是個人總結(jié):
(1)靜態(tài)成員不能在類中初始化;非靜態(tài)成員可直接初始化,靜態(tài)成員在類中只是聲明,所以不能直接初始化。輔以const的靜態(tài)成員可以直接初始化,但那是const的能力而非static所有;
(2)對靜態(tài)成員初始化,需要在類之外定義時再完成;
(3)初始化時不受訪問修飾符限制;private類型的靜態(tài)成員可直接訪問并賦值;
(4)靜態(tài)成員初始化時可調(diào)用函數(shù),并且可以直接調(diào)用所屬類的私有函數(shù);
其中第4點比較重要。在不支持C++11的編譯器上,要完成靜態(tài)map成員,就不得不借助函數(shù)返回:

C++11引入了統(tǒng)一初始化和lambda表達式,初始化的寫法更為簡單:

靜態(tài)成員的這些異常行為很容易聯(lián)想到全局變量,兩者有許多相通的地方:在程序啟動前完成初始化,在程序終止后銷毀;存放的地方都是靜態(tài)存儲區(qū)而非堆棧;通過名字空間操作符獲取值;在非函數(shù)塊內(nèi)通過函數(shù)調(diào)用或者lambda表達式完成初始化…
雖然各種面向?qū)ο缶幊陶Z言都有靜態(tài)變量,并且使用比例不低。但從面向?qū)ο蟮慕嵌?,靜態(tài)成員是另一種形式的全局變量,其破壞了隔離和封裝,增加了類之間的耦合,讓測試變得更困難。實際編程中,應(yīng)當慎用全局變量,并收緊其訪問權(quán)限。
所以本質(zhì)上靜態(tài)成員也是全局變量,只是歸屬到特定類的名下。
你懂了嗎?
那么今天的分享就到這里了,后續(xù)會更新更多精彩項目或者知識內(nèi)容的,大家要好好學C語言C++喲~
寫在最后:對于準備學習C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
微信公眾號:C語言編程學習基地
整理分享(多年學習的源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
