


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C/C+ +的st at ic有兩種用法:面向過(guò)程程序設(shè)計(jì)中的static和面向?qū)ο蟪绦蛟O(shè)計(jì)中的static。前者應(yīng)用于普通變量和函數(shù),不涉及類(lèi);后者主要說(shuō)明static在類(lèi)中的作用。一、面向過(guò)程設(shè)計(jì)中的 static1、靜態(tài)全局變量在全局變量前,加上關(guān)鍵字static,該變量就被定義成為一個(gè)靜態(tài)全局變量。我們先舉一個(gè)靜態(tài)全局變量的例子 ,如下:/E x a mpl e 1#i n clu d e vi ostre a m.h>vo id f n(); st a t i c int n; / /定義 靜態(tài)全局變量v o id mai n() n=2 0 ; c out<< n
2、 <<e ndl; fn() ; vo id f n() n+; c o ut< v n< v end 1 ;靜態(tài)全局變量有以下特點(diǎn) :該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存 ;未經(jīng)初始化的靜態(tài)全局變量會(huì)被程序自動(dòng)初始化為0(自動(dòng)變量的值是隨機(jī)的,除非它被顯式初始化 );靜態(tài)全局變量在聲明它的整個(gè)文件都是可見(jiàn)的,而在文件之外是不可見(jiàn)的; 靜態(tài)變量都在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,包括后面將要提到的靜態(tài)局部變量。對(duì)于一個(gè)完整的程序 ,在內(nèi)存中的分布情況如下圖:代碼區(qū)全局?jǐn)?shù)據(jù)區(qū)堆區(qū)棧區(qū)一般程序的由n ew產(chǎn)生的動(dòng)態(tài)數(shù)據(jù)存放在堆區(qū),函數(shù)內(nèi)部的自動(dòng)變量存放在棧區(qū)。自 動(dòng)變量一般會(huì)隨著函數(shù)的退出而釋放
3、空間, 靜態(tài)數(shù)據(jù) (即使是函數(shù)內(nèi)部的靜態(tài)局部變量) 也存放在全局?jǐn)?shù)據(jù)區(qū)。 全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù)并不會(huì)因?yàn)楹瘮?shù)的退出而釋放空間。 細(xì)心的讀者可能 會(huì)發(fā)現(xiàn),Exam p le 1中的代碼中將static int n;/定義靜態(tài)全局變量改為int n ;/定義全局變量程序照樣正常運(yùn)行。的確 ,定義全局變量就可以實(shí)現(xiàn)變量在文件中的共享,但定義靜態(tài)全局變量還有以下好處:靜態(tài)全局變量不能被其它文件所用 ;其它文件中可以定義相同名字的變量,不會(huì)發(fā)生沖突 ;您可以將上述示例代碼改為如下:/E xamp le 2/ <iostream.h>vo i d fn();staticin t n; /定義靜態(tài)全
4、局變量 void main() n=20 ; co utvv n< ven dl; fn (); / <iostre a m.h>e xte rn int n ;void fn() n+;cou tv <n<<endl;編譯并運(yùn)行Exam ple 2,您就會(huì)發(fā)現(xiàn)上述代碼可以分別通過(guò)編譯,但運(yùn)行時(shí)出現(xiàn)錯(cuò)誤。 試著將s tatic in t n; /定義靜態(tài)全局變量改為int n;/定義全局變量再次編譯運(yùn)行程序,細(xì)心體會(huì)全局變量和靜態(tài)全局變量的區(qū)別。2、靜態(tài)局部變量在局部變量前,加上關(guān)鍵字static,該變量就被定義成為一個(gè)靜態(tài)局部變量。我們先舉一個(gè)靜態(tài)局部變量
5、的例子,如下:/ /E xam pie3# i n cl ud e <iostr ea m. h >voi d f n (); void m a i n() fn() ; fn();fn() ; void fn( ) sta t ic n =10; c out< v n<<endl; n+ +; 通常 ,在函數(shù)體內(nèi)定義了一個(gè)變量,每當(dāng)程序運(yùn)行到該語(yǔ)句時(shí)都會(huì)給該局部變量分配棧 內(nèi)存。但隨著程序退出函數(shù)體,系統(tǒng)就會(huì)收回棧內(nèi)存,局部變量也相應(yīng)失效。但有時(shí)候我們需要在兩次調(diào)用之間對(duì)變量的值進(jìn)行保存。 通常的想法是定義一個(gè)全局變 量來(lái)實(shí)現(xiàn)。但這樣一來(lái) ,變量已經(jīng)不再屬于函數(shù)
6、本身了,不再僅受函數(shù)的控制,給程序的維護(hù)帶來(lái)不便。靜態(tài)局部變量正好可以解決這個(gè)問(wèn)題。靜態(tài)局部變量保存在全局?jǐn)?shù)據(jù)區(qū),而不是保存在棧中,每次的值保持到下一次調(diào)用,直到下次賦新值。靜態(tài)局部變量有以下特點(diǎn):該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存; 靜態(tài)局部變量在程序執(zhí)行到該對(duì)象的聲明處時(shí)被首次初始化,即以后的函數(shù)調(diào)用不再進(jìn)行初始化;靜態(tài)局部變量一般在聲明處初始化,如果沒(méi)有顯式初始化 ,會(huì)被程序自動(dòng)初始化為0;它始終駐留在全局?jǐn)?shù)據(jù)區(qū) ,直到程序運(yùn)行結(jié)束。但其作用域?yàn)榫植孔饔糜?當(dāng)定義它的函數(shù)或語(yǔ)句塊結(jié)束時(shí) ,其作用域隨之結(jié)束 ;3、靜態(tài)函數(shù)在函數(shù)的返回類(lèi)型前加上 stat ic 關(guān)鍵字 ,函數(shù)即被定義為靜態(tài)函數(shù)。靜
7、態(tài)函數(shù)與普通函 數(shù)不同 ,它只能在聲明它的文件當(dāng)中可見(jiàn),不能被其它文件使用。靜態(tài)函數(shù)的例子 :Exa m ple 4 #inc l ud e <i o s t ream .h> st ati c vo id fn();/ 聲明靜態(tài)函數(shù)voi d m a in () fn();void fn( ) /定義靜態(tài)函數(shù) int n=10; c o u t <<*<e n d l; 定義靜態(tài)函數(shù)的好處 :靜態(tài)函數(shù)不能被其它文件所用 ;其它文件中可以定義相同名字的函數(shù),不會(huì)發(fā)生沖突;二、面向?qū)ο蟮膕 t a t i c關(guān)鍵字(類(lèi)中的static關(guān)鍵字)1、靜態(tài)數(shù)據(jù)成員在類(lèi)內(nèi)數(shù)
8、據(jù)成員的聲明前加上關(guān)鍵字 st atic ,該數(shù)據(jù)成員就是類(lèi)內(nèi)的靜態(tài)數(shù)據(jù)成員。先舉一個(gè)靜態(tài)數(shù)據(jù)成員的例子。/Examp l e 5 #i n c l ud e viostream.h >c l ass Mycl a s s p ublic: M y class(in t a,in t b,int c); void GetSum ();p r ivate : i n t a , b , c; static i nt Sum ; /聲明靜態(tài) 數(shù)據(jù)成員 ; i nt M y cl a ss: : Sum= 0;/定義并初始化靜態(tài)數(shù)據(jù)成員M y c l ass:: Mycla ss (in t
9、a,i n t b, int c ) th is >a= a; t h is -> b=b; t hi s>c =c; S u m +=a + b+c;void My cla s s :Get Su m() c out<<"S u m="<<Sum<< e ndl; v o id m ain () Myclass M( 1, 2,3); M. G etSum (); M yclass N( 4 , 5 ,6 ); N .Get Sum (); M . G et Sum() ;可以看出,靜態(tài)數(shù)據(jù)成員有以下特點(diǎn) :對(duì)于非靜態(tài)
10、數(shù)據(jù)成員,每個(gè)類(lèi)對(duì)象都有自己的拷貝。而靜態(tài)數(shù)據(jù)成員被當(dāng)作是類(lèi)的成員。無(wú)論這個(gè)類(lèi)的對(duì)象被定義了多少個(gè),靜態(tài)數(shù)據(jù)成員在程序中也只有一份拷貝,由該類(lèi)型的所有對(duì)象共享訪問(wèn)。 也就是說(shuō), 靜態(tài)數(shù)據(jù)成員是該類(lèi)的所有對(duì)象所共有的。對(duì)該類(lèi)的多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)成員只分配一次內(nèi)存,供所有對(duì)象共用。所以 ,靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣的 ,它的值可以更新;靜態(tài)數(shù)據(jù)成員存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū)。靜態(tài)數(shù)據(jù)成員定義時(shí)要分配空間,所以不能在類(lèi)聲明中定義。在E xam p le 5中,語(yǔ)句int My class: : Su m=0;是定義靜態(tài)數(shù)據(jù)成員; 靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員一樣遵從public,protect ed
11、, pr i vat e訪問(wèn)規(guī)則;因?yàn)殪o態(tài)數(shù)據(jù)成員在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,屬于本類(lèi)的所有對(duì)象共享,所以,它不屬于特定的類(lèi)對(duì)象 ,在沒(méi)有產(chǎn)生類(lèi)對(duì)象時(shí)其作用域就可見(jiàn),即在沒(méi)有產(chǎn)生類(lèi)的實(shí)例時(shí),我們就可以操作它;靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式為:<數(shù)據(jù)類(lèi)型v類(lèi)名: < 靜態(tài)數(shù)據(jù)成員名=< 值 類(lèi)的靜態(tài)數(shù)據(jù)成員有兩種訪問(wèn)形式:<類(lèi)對(duì)象名 >. <靜態(tài)數(shù)據(jù)成員名或 <類(lèi)類(lèi)型名 >:: <靜態(tài)數(shù)據(jù)成員名如果靜態(tài)數(shù)據(jù)成員的訪問(wèn)權(quán)限允許的話(即 publi c 的成員),可在程序中,按上述格 式來(lái)引用靜態(tài)數(shù)據(jù)成員 ;靜態(tài)數(shù)
12、據(jù)成員主要用在各個(gè)對(duì)象都有相同的某項(xiàng)屬性的時(shí)候。比如對(duì)于一個(gè)存款類(lèi), 每個(gè)實(shí)例的利息都是相同的。所以,應(yīng)該把利息設(shè)為存款類(lèi)的靜態(tài)數(shù)據(jù)成員。這有兩個(gè)好處 ,第一, 不管定義多少個(gè)存款類(lèi)對(duì)象, 利息數(shù)據(jù)成員都共享分配在全局?jǐn)?shù)據(jù)區(qū)的內(nèi)存, 所以節(jié) 省存儲(chǔ)空間。 第二,一旦利息需要改變時(shí) ,只要改變一次,則所有存款類(lèi)對(duì)象的利息全改變過(guò)來(lái)了;同全局變量相比,使用靜態(tài)數(shù)據(jù)成員有兩個(gè)優(yōu)勢(shì) : 靜態(tài)數(shù)據(jù)成員沒(méi)有進(jìn)入程序的全局名字空間,因此不存在與程序中其它全局名字沖突的可能性 ;可以實(shí)現(xiàn)信息隱藏。靜態(tài)數(shù)據(jù)成員可以是priv ate成員,而全局變量不能;2、靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,我們也可以創(chuàng)建一個(gè)靜態(tài)
13、成員函數(shù),它為類(lèi)的全部服務(wù)而不是為某一個(gè)類(lèi)的具體對(duì)象服務(wù)。靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,都是類(lèi)的內(nèi)部 實(shí)現(xiàn),屬于類(lèi)定義的一部分。普通的成員函數(shù)一般都隱含了一個(gè)thi s指針,this指針指向類(lèi)的對(duì)象本身,因?yàn)槠胀ǔ蓡T函數(shù)總是具體的屬于某個(gè)類(lèi)的具體對(duì)象的。通常情況下,t his 是缺省的。如函數(shù) fn ()實(shí)際上是 this->f n ()。但是與普通函數(shù)相比 ,靜態(tài)成員函數(shù)由于不是與任何的對(duì) 象相聯(lián)系,因此它不具有thi s指針。從這個(gè)意義上講,它無(wú)法訪問(wèn)屬于類(lèi)對(duì)象的非靜態(tài)數(shù)據(jù) 成員,也無(wú)法訪問(wèn)非靜態(tài)成員函數(shù),它只能調(diào)用其余的靜態(tài)成員函數(shù)。下面舉個(gè)靜態(tài)成員函數(shù)的例子。/ / Ex a
14、mp 1 e 6#i nc lude < io stream .h > class My c la s sp u b 1 i c : M y c lass(i nt a,i n t b, i n t c); stati c void G e tSum() ;/聲明靜態(tài)成員函數(shù) pr i vate : i n t a ,b,c; stat ic in t Su m;/聲明靜態(tài)數(shù)據(jù)成員 ; i nt My c las s :S u m=0; 定義并 初始化靜態(tài)數(shù)據(jù)成員 M y class:M y class(int a,in t b,i n t c) this -> a = a ; thi s ->b =b; t hi s ->c=c; S u m+=a+ b +c; /非靜態(tài)成員函數(shù)可以訪問(wèn)靜態(tài)數(shù)據(jù)成員v oi dMyclas s :GetS u m() /靜態(tài)成員函數(shù)的實(shí)現(xiàn)/ / co ut<<a<<en d l; /錯(cuò)誤代碼,a是非靜態(tài) 數(shù)據(jù)成員 cou t < < "S u m=" <<S u m< <e n d 1; v o id m ai n () M yclass M( 1,2 , 3) ; M .Ge t S um() ; M yc
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 樓房裝修承攬合同范本
- l建設(shè)工程合同范本
- 合作加工木材合同范本
- 北京租房合同范本封面
- 廠區(qū)快遞轉(zhuǎn)讓合同范本
- 倉(cāng)庫(kù)雜物搬運(yùn)勞務(wù)合同范本
- 合伙臨時(shí)合同范本
- 合同里寫(xiě)定價(jià)合同范本
- 信息技術(shù)合同范本
- 廠家網(wǎng)店授權(quán)合同范例
- 《電梯安全教育培訓(xùn)》課件
- 2024年山東司法警官職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 《業(yè)財(cái)一體化實(shí)訓(xùn)教程-金蝶云星空V7.5》
- 《性病防治知識(shí)講座》課件
- 工業(yè)機(jī)器人工作站系統(tǒng)組建課件 5.1康耐視is2000工業(yè)相機(jī)視覺(jué)識(shí)別操作
- 2025年中智集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 肝癌圍手術(shù)期的護(hù)理
- 基本公共衛(wèi)生服務(wù)項(xiàng)目培訓(xùn)
- 北師大版(2024新版)七年級(jí)上冊(cè)數(shù)學(xué)期末模擬測(cè)試卷(含答案)
- 消防行業(yè)崗位培訓(xùn)與校企聯(lián)合方案
- 四川政采評(píng)審專(zhuān)家入庫(kù)考試基礎(chǔ)題復(fù)習(xí)測(cè)試有答案
評(píng)論
0/150
提交評(píng)論