static 用法

C++內(nèi)存分配方式詳解

http://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html

static 用來控制變量的存儲(chǔ)方式和可見性

函數(shù)內(nèi)部定義的變量,在程序執(zhí)行到它的定義處時(shí)夜牡,編譯器為它在棧上分配空間仇参,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時(shí)會(huì)釋放掉厢塘,這樣就產(chǎn)生了一個(gè)問題:如果想將函數(shù)中此變量的值保存至下一次調(diào)用時(shí)丐一,如何實(shí)現(xiàn)阿弃?最容易想到的方法是定義一個(gè)全局的變量支救,但定義為一個(gè)全局變量有許多缺點(diǎn)循诉,最明顯的缺點(diǎn)是破壞了此變量的訪問范圍(使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)控制)懂酱。需要一個(gè)數(shù)據(jù)對(duì)象為整個(gè)類而非某個(gè)對(duì)象服務(wù)竹习,同時(shí)又力求不破壞類的封裝性,即要求此成員隱藏在類的內(nèi)部列牺,對(duì)外不可見整陌。

static 的內(nèi)部機(jī)制

靜態(tài)數(shù)據(jù)成員要在程序一開始運(yùn)行時(shí)就必須存在。因?yàn)楹瘮?shù)在程序運(yùn)行中被調(diào)用瞎领,所以靜態(tài)數(shù)據(jù)成員不能在任何函數(shù)內(nèi)分配空間和初始化蔓榄。這樣,它的空間分配有三個(gè)可能的地方默刚,一是作為類的外部接口的頭文件甥郑,那里有類聲明;二是類定義的內(nèi)部實(shí)現(xiàn)荤西,那里有類的成員函數(shù)定義澜搅;三是應(yīng)用程序的main()函數(shù)前的全局?jǐn)?shù)據(jù)聲明和定義處伍俘。

靜態(tài)數(shù)據(jù)成員要實(shí)際地分配空間,故不能在類的聲明中定義(只能聲明數(shù)據(jù)成員)勉躺。類聲明只聲明一個(gè)類的“尺寸和規(guī)格”癌瘾,并不進(jìn)行實(shí)際的內(nèi)存分配,所以在類聲明中寫成定義是錯(cuò)誤的饵溅。它也不能在頭文件中類聲明的外部定義妨退,因?yàn)槟菚?huì)造成在多個(gè)使用該類的源文件中,對(duì)其重復(fù)定義蜕企。

static被引入以告知編譯器咬荷,將變量存儲(chǔ)在程序的靜態(tài)存儲(chǔ)區(qū)而非棧上空間,靜態(tài)數(shù)據(jù)成員按定義出現(xiàn)的先后順序依次初始化轻掩,注意靜態(tài)成員嵌套時(shí)幸乒,要保證所嵌套的成員已經(jīng)初始化了。消除時(shí)的順序是初始化的反順序唇牧。

static 的優(yōu)勢

可以節(jié)省內(nèi)存罕扎,因?yàn)樗撬袑?duì)象所公有的,因此丐重,對(duì)多個(gè)對(duì)象來說腔召,靜態(tài)數(shù)據(jù)成員只存儲(chǔ)一處,供所有對(duì)象共用扮惦。靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣臀蛛,但它的值是可以更新的。只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新一次径缅,保證所有對(duì)象存取更新后的相同的值掺栅,這樣可以提高時(shí)間效率烙肺。引用靜態(tài)數(shù)據(jù)成員時(shí)纳猪,采用如下格式:

<類名>::<靜態(tài)成員名>

如果靜態(tài)數(shù)據(jù)成員的訪問權(quán)限允許的話(即public的成員),可在程序中桃笙,按上述格式來引用靜態(tài)數(shù)據(jù)成員氏堤。

Ps

(1)類的靜態(tài)成員函數(shù)是屬于整個(gè)類而非類的對(duì)象,所以它沒有this指針搏明,這就導(dǎo)致了它僅能訪問類的靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)鼠锈。

(2)不能將靜態(tài)成員函數(shù)定義為虛函數(shù)。

(3)由于靜態(tài)成員聲明于類中星著,操作于其外购笆,所以對(duì)其取地址操作,就多少有些特殊虚循,變量地址是指向其數(shù)據(jù)類型的指針同欠,函數(shù)地址類型是一個(gè)“nonmember函數(shù)指針”样傍。

(4)由于靜態(tài)成員函數(shù)沒有this指針,所以就差不多等同于nonmember函數(shù)铺遂,結(jié)果就產(chǎn)生了一個(gè)意想不到的好處:成為一個(gè)callback函數(shù)衫哥,使得我們得以將c++和c-based x window系統(tǒng)結(jié)合,同時(shí)也成功的應(yīng)用于線程函數(shù)身上襟锐。

(5) static并沒有增加程序的時(shí)空開銷撤逢,相反她還縮短了子類對(duì)父類靜態(tài)成員的訪問時(shí)間,節(jié)省了子類的內(nèi)存空間粮坞。

(6)靜態(tài)數(shù)據(jù)成員在<定義或說明>時(shí)前面加關(guān)鍵字static蚊荣。

(7)靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲(chǔ)的,所以必須對(duì)它進(jìn)行初始化捞蚂。

(8)靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同:

初始化在類體外進(jìn)行妇押,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?/p>

初始化時(shí)不加該成員的訪問權(quán)限控制符private姓迅、public敲霍;

初始化時(shí)使用作用域運(yùn)算符來標(biāo)明它所屬類;

所以我們得出靜態(tài)數(shù)據(jù)成員初始化的格式:

<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>

(9)為了防止父類的影響丁存,可以在子類定義一個(gè)與父類相同的靜態(tài)變量肩杈,以屏蔽父類的影響。這里有一點(diǎn)需要注意:我們說靜態(tài)成員為父類和子類共享解寝,但我們有重復(fù)定義了靜態(tài)成員扩然,這會(huì)不會(huì)引起錯(cuò)誤呢?不會(huì)聋伦,我們的編譯器采用了一種絕妙的手法:name-mangling用以生成唯一的標(biāo)志夫偶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市觉增,隨后出現(xiàn)的幾起案子灵巧,更是在濱河造成了極大的恐慌欢伏,老刑警劉巖曲聂,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畸肆,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘹履,警方通過查閱死者的電腦和手機(jī)腻扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砾嫉,“玉大人幼苛,你說我怎么就攤上這事』拦危” “怎么了舶沿?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵舌剂,是天一觀的道長。 經(jīng)常有香客問我暑椰,道長霍转,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任一汽,我火速辦了婚禮避消,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘召夹。我一直安慰自己岩喷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布监憎。 她就那樣靜靜地躺著纱意,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲸阔。 梳的紋絲不亂的頭發(fā)上偷霉,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音褐筛,去河邊找鬼类少。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渔扎,可吹牛的內(nèi)容都是我干的硫狞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晃痴,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼残吩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倘核,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤泣侮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后笤虫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旁瘫,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祖凫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年琼蚯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠况。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遭庶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稠屠,到底是詐尸還是另有隱情峦睡,我是刑警寧澤翎苫,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站榨了,受9級(jí)特大地震影響煎谍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龙屉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一呐粘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧转捕,春花似錦作岖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枢步,卻和暖如春沉删,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醉途。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工丑念, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人结蟋。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓脯倚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嵌屎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子推正,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評(píng)論 1 51
  • 1 C語言中 在C語言中,static有三個(gè)明顯作用: 函數(shù)體內(nèi)static變量宝惰,不會(huì)隨函數(shù)結(jié)束而消亡植榕。再次調(diào)用該...
    saviochen閱讀 1,821評(píng)論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法尼夺,內(nèi)部類的語法尊残,繼承相關(guān)的語法,異常的語法淤堵,線程的語...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • (一) 我:爸寝衫,我為什么要練功? 爸:為了報(bào)仇拐邪。 我:報(bào)仇慰毅? 爸:是的。 我:殺誰扎阶? 爸:你媽汹胃。 我:媽不是早死了...
    后畏小生閱讀 1,396評(píng)論 43 31
  • 廈門雙十中學(xué)角美分校 葉智秋 夕陽的余暉烙印在石板路旁婶芭。石板路上長滿了青苔,下過雨的石板街着饥,雨水堆積在尖尖屋檐...
    胡美云閱讀 399評(píng)論 4 6