C++ static關(guān)鍵字總結(jié)

引言
靜態(tài)變量作用范圍在一個(gè)文件內(nèi),程序開(kāi)始時(shí)分配空間,結(jié)束時(shí)釋放空間,默認(rèn)初始化為0,使用時(shí)可以改變其值。
靜態(tài)變量, 不管你是否使用該函數(shù),在程序初始化時(shí)就被分配的了,或者在第一次執(zhí)行到它的聲明的時(shí)候分配(不同的編譯器可能不同),注意是聲明的時(shí)候
如果使用的是const類型的static變量,那么就要在類中初始化:只有靜態(tài)常量的整形數(shù)據(jù)成員才可以在類中初始化。
程序的內(nèi)存分配
一、預(yù)備知識(shí)—程序的內(nèi)存分配
一個(gè)由c/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分
1、棧區(qū)(stack)— 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。
3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域(.data),未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域(.bss)。 - 程序結(jié)束后由系統(tǒng)釋放。
4、文字常量區(qū) —常量字符串就是放在這里的(.rodata)。 程序結(jié)束后由系統(tǒng)釋放。
5、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼(.text)。

概述:靜態(tài)變量作用范圍在一個(gè)文件內(nèi),程序開(kāi)始時(shí)分配空間,結(jié)束時(shí)釋放空間,默認(rèn)初始化為0,使用時(shí)可以改變其值。

存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)的變量會(huì)在程序剛開(kāi)始運(yùn)行時(shí)就完成初始化,也是唯一的一次初始化。共有兩種變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū):全局變量和static變量,只不過(guò)和全局變量比起來(lái),static可以控制變量的可見(jiàn)范圍,說(shuō)到底static還是用來(lái)隱藏的。

1.static關(guān)鍵字的作用
數(shù)據(jù)共享,減小內(nèi)存;
可以保持封裝特性;避免命名沖突的問(wèn)題
2.static 關(guān)鍵字的生命周期
程序一開(kāi)始運(yùn)行時(shí),變量就存在,變量存于內(nèi)存的靜態(tài)存儲(chǔ)區(qū);程序
運(yùn)行結(jié)束時(shí),由系統(tǒng)自動(dòng)釋放
3.static 關(guān)鍵字的初始化位置
在類的聲明體之外進(jìn)行初始化,初始化時(shí),不需要有static關(guān)鍵字

1.非靜態(tài)的全局變量在各個(gè)源文件中都是有效的;
靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它

  1. 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍
    3.static全局變量與普通的全局變量有什么區(qū)別:
    static全局變量只初使化一次,防止在其他文件單元中被引用;   
    static局部變量和普通局部變量有什么區(qū)別:
    static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;   
    static函數(shù)與普通函數(shù)有什么區(qū)別:
    static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝

auto 與 static的區(qū)別:
auto的含義是由程序自動(dòng)控制變量的生存周期,通常指的就是變量在進(jìn)入其作用域的時(shí)候被分配,離開(kāi)其作用域的時(shí)候被釋放;而static就是不auto,變量在程序初始化時(shí)被分配,直到程序退出前才被釋放;也就是static是按照程序的生命周期來(lái)分配釋放變量的,而不是變量自己的生命周期;

靜態(tài)數(shù)據(jù)成員存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū)。靜態(tài)數(shù)據(jù)成員定義時(shí)要分配空間,所以不能在類聲明中定義。

static變量只有一次初始化,不管在類中還是在函數(shù)中
類的靜態(tài)函數(shù)
實(shí)現(xiàn)的時(shí)候也不需要static的修飾,因?yàn)閟tatic是聲明性關(guān)鍵字(同friend,聲明時(shí)只需在友元的名稱前加上關(guān)鍵字friend);類的靜態(tài)函數(shù)是在該類的范疇內(nèi)的全局函數(shù),不能訪問(wèn)類的私有成員,只能訪問(wèn)類的靜態(tài)成員,不需要類的實(shí)例即可調(diào)用;實(shí)際上,它就是增加了類的訪問(wèn)權(quán)限的全局函數(shù)

靜態(tài)成員函數(shù)可以繼承和覆蓋,但無(wú)法是虛函數(shù)
常量靜態(tài)成員必須在類中定義的,不可以const static在類外定義。

靜態(tài)數(shù)據(jù)成員不能在類中初始化的原因:
靜態(tài)數(shù)據(jù)成員不能在類中初始化,實(shí)際上類定義只是在描述對(duì)象的藍(lán)圖,在其中指定初值是不允許的。也不能在夠造函數(shù)中初始化該成員,因?yàn)殪o態(tài)數(shù)據(jù)成員為類的各個(gè)對(duì)象共享,那么每次創(chuàng)建一個(gè)類的對(duì)象則靜態(tài)數(shù)據(jù)成員都要被重新初始化
總結(jié)

image.png

參考鏈接:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html

http://www.cnblogs.com/youxin/archive/2012/05/17/2506757.html

http://blog.csdn.net/hankai1024/article/details/10336219

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

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

  • C++的static有兩種用法:面向過(guò)程程序設(shè)計(jì)中的static和面向?qū)ο蟪绦蛟O(shè)計(jì)中的static。前者應(yīng)用于普通...
    yangqi916閱讀 456評(píng)論 0 0
  • 一直使用static,但沒(méi)用總結(jié)過(guò),時(shí)間一長(zhǎng)概念總有點(diǎn)模糊,趁著這次機(jī)會(huì)總結(jié)一下。c++中:C++中static有...
    被代碼淹沒(méi)的小伙子閱讀 567評(píng)論 0 0
  • 第一天 一.內(nèi)聯(lián)函數(shù)(inline) 函數(shù)調(diào)用的時(shí)候需要建立棧內(nèi)存環(huán)境,進(jìn)行參數(shù)傳遞,并產(chǎn)生程序執(zhí)行轉(zhuǎn)移,這些工作...
    陳果123閱讀 1,219評(píng)論 0 1
  • 我很高興,你終于有了新的生活而漸漸淡忘了我。 我很高興,你已經(jīng)不會(huì)在我發(fā)過(guò)的每一條微博、朋友圈留下評(píng)論, 也沒(méi)有像...
    地球人生存指南閱讀 556評(píng)論 1 4
  • 小說(shuō)閑評(píng)(一)閑評(píng)《儒林外史》 《儒林外史》是我國(guó)清代的一部章回體長(zhǎng)篇諷刺小說(shuō)。全書(shū)一共55回。它以揭露古代科舉制...
    龍幽天下閱讀 471評(píng)論 0 0

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