引言
靜態(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)有效, 在同一源程序的其它源文件中不能使用它
- 把局部變量改變?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é)
參考鏈接:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html
http://www.cnblogs.com/youxin/archive/2012/05/17/2506757.html