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

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

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

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

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

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

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

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

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

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

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

靜態(tài)數(shù)據(jù)成員不能在類中初始化的原因:
靜態(tài)數(shù)據(jù)成員不能在類中初始化,實際上類定義只是在描述對象的藍圖,在其中指定初值是不允許的。也不能在夠造函數(shù)中初始化該成員,因為靜態(tài)數(shù)據(jù)成員為類的各個對象共享,那么每次創(chuàng)建一個類的對象則靜態(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)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

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