版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
類的數(shù)據(jù)共享與保護(hù)第1頁(yè),共29頁(yè),2023年,2月20日,星期四6.1對(duì)象(變量)的作用域、可見性和生存期
對(duì)象(變量)的作用域:指對(duì)象的有效范圍。
-一般情況下,對(duì)象在其作用域內(nèi)是可見的和存在的,對(duì)象的作用域、可見性和生存期三者是一致的。
對(duì)象(變量)的可見性:指不同作用域的同名對(duì)象在其作用域范圍內(nèi)的某一處是否可被引用。
對(duì)象(變量)的生存期:指對(duì)象從誕生(占據(jù)內(nèi)存)到結(jié)束(不占內(nèi)存)的這段時(shí)間。在生存期內(nèi),對(duì)象或變量將保持它的值不變,直到它們被更新為止。
-對(duì)象(變量)的生存期分為動(dòng)態(tài)生存期和靜態(tài)生存期兩種。第2頁(yè),共29頁(yè),2023年,2月20日,星期四6.1.1對(duì)象(變量)的作用域局部對(duì)象(變量):(函數(shù)內(nèi))塊作用域
-從聲明處開始到塊結(jié)束的花括號(hào)為止形參對(duì)象(變量):函數(shù)作用域
-在整個(gè)函數(shù)內(nèi)有效
成員對(duì)象(變量):類作用域
-在整個(gè)類內(nèi)有效,即在所有成員函數(shù)內(nèi)有效全局對(duì)象(變量):文件作用域
-在整個(gè)文件內(nèi)有效第3頁(yè),共29頁(yè),2023年,2月20日,星期四6.1.2對(duì)象(變量)的可見性一般情況下對(duì)象(變量)在其作用域范圍內(nèi)的任一處是可見的,即可被引用。在有不同作用域的多個(gè)同名對(duì)象(變量)的情況下,外層對(duì)象(變量)在內(nèi)層不可見,被隱藏起來(lái)。塊作用域類作用域文件作用域函數(shù)作用域作用域關(guān)系圖不同作用域的同名對(duì)象的包含關(guān)系如右圖所示。
被隱藏的成員對(duì)象(變量)
可加“類名::”來(lái)顯式地引用,
被隱藏的全局對(duì)象(變量)
可加“::”來(lái)顯式地引用。第4頁(yè),共29頁(yè),2023年,2月20日,星期四6.1.3對(duì)象(變量)的生存期對(duì)象(變量)的生存期:動(dòng)態(tài)生存期、靜態(tài)生存期。動(dòng)態(tài)生存期:對(duì)象(變量)在程序運(yùn)行期間隨時(shí)誕生和消失,如局部變量、形參變量、成員變量。靜態(tài)生存期:對(duì)象(變量)在程序運(yùn)行期間一直存在,如全局變量。C語(yǔ)言中靜態(tài)局部變量:作用域與生存期不一致。C++在類的成員函數(shù)中定義一個(gè)靜態(tài)局部變量:該類的所有對(duì)象在調(diào)用這個(gè)成員函數(shù)時(shí)將共享這個(gè)變量。C++類的成員為靜態(tài)成員:靜態(tài)成員為該類所有對(duì)象所共享,它不屬于某個(gè)對(duì)象的,見下節(jié)。程序?qū)嵗?頁(yè),共29頁(yè),2023年,2月20日,星期四6.2靜態(tài)成員(static)在C語(yǔ)言中,當(dāng)把函數(shù)的一個(gè)局部變量說明為靜態(tài)的,則該變量在函數(shù)調(diào)用結(jié)束后其值仍然存在,但其它函數(shù)不能引用。若下次再調(diào)用該函數(shù),則該變量的值不再重新初始化為0,函數(shù)可以使用上次調(diào)用所保留的值。在C++中,對(duì)于某個(gè)類所定義的每一個(gè)對(duì)象,都有其屬于自身的數(shù)據(jù)成員與成員函數(shù),不同對(duì)象之間的成員是互不相干的,這類似于C中函數(shù)內(nèi)的局部變量,不同時(shí)間函數(shù)調(diào)用的局部變量是互不相干的。但它們都同名。第6頁(yè),共29頁(yè),2023年,2月20日,星期四因此,在C++中,當(dāng)把類的某個(gè)成員用關(guān)鍵字static說明為靜態(tài)成員時(shí),就是把該成員定義為在該類范圍內(nèi)的全局成員,即無(wú)論這個(gè)類建立了多少個(gè)對(duì)象,所有對(duì)象都共用這個(gè)成員。因此,靜態(tài)成員的主要用途是定義類的各個(gè)對(duì)象所共用的數(shù)據(jù)成員或成員函數(shù),其中尤其是數(shù)據(jù)成員。下面對(duì)靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)分別進(jìn)行討論。第7頁(yè),共29頁(yè),2023年,2月20日,星期四6.2.1靜態(tài)數(shù)據(jù)成員
在一個(gè)類中,若將一個(gè)數(shù)據(jù)成員說明為static,則該數(shù)據(jù)成員稱為靜態(tài)數(shù)據(jù)成員,無(wú)論建立多少個(gè)該類的對(duì)象,都只有一個(gè)共同的數(shù)據(jù)成員。static數(shù)據(jù)成員在編譯時(shí)按全局變量方式被分配存儲(chǔ)單元并初始化,默認(rèn)的初始值為零。欲聲明一個(gè)成員為靜態(tài)的,只要在其前方加上關(guān)鍵字static即可,如在Point類定義一個(gè)靜態(tài)數(shù)據(jù)成員countP:
staticintcountP;第8頁(yè),共29頁(yè),2023年,2月20日,星期四靜態(tài)數(shù)據(jù)成員的使用與普通數(shù)據(jù)成員的使用并無(wú)差異,但必須注意兩點(diǎn):
a.由于靜態(tài)數(shù)據(jù)成員在該類范圍內(nèi)是一個(gè)全局變量,因此必須在類定義外的全局范圍中給它賦初值,然后才能使用。如下所示:
intPoint::countP=0;給靜態(tài)數(shù)據(jù)成員賦初值時(shí)必須同時(shí)指名數(shù)據(jù)類型與所屬的類,用類名加作用域運(yùn)算符來(lái)限定。這里的數(shù)據(jù)類型必須與在類中聲明的數(shù)據(jù)類型一致。第9頁(yè),共29頁(yè),2023年,2月20日,星期四由于靜態(tài)數(shù)據(jù)成員并不特別屬于某一個(gè)對(duì)象,上述這樣的賦初值語(yǔ)句只能在整個(gè)程序中出現(xiàn)一次。因此,程序員最好不要把靜態(tài)成員的初始化定義在頭文件中,因?yàn)轭^文件可能在程序中多次被引入使用,否則將發(fā)生錯(cuò)誤。
b.當(dāng)靜態(tài)數(shù)據(jù)成員聲明于類的public區(qū)時(shí),由于它并不特別屬于某一個(gè)對(duì)象,在類范圍內(nèi)是全局的,因此可以在程序的任何地方直接引用該靜態(tài)數(shù)據(jù)成員,但使用時(shí)必須加上類范圍的限制,如:
cout<<"對(duì)象個(gè)數(shù)為:"<<Point::countP;第10頁(yè),共29頁(yè),2023年,2月20日,星期四下面我們來(lái)看看例5-4(P138)。由于靜態(tài)數(shù)據(jù)成員是所有同類對(duì)象所共用的數(shù)據(jù),所以
A.getC();B.getC();這兩個(gè)輸出語(yǔ)句的結(jié)果是相同的,即:
對(duì)象個(gè)數(shù)為:2
對(duì)象個(gè)數(shù)為:2
從程序的最后兩句可以看出,類的public數(shù)據(jù)成員有兩種使用方法:第11頁(yè),共29頁(yè),2023年,2月20日,星期四6.2.2靜態(tài)成員函數(shù)
成員函數(shù)也可以被聲明為靜態(tài)的。當(dāng)一個(gè)成員函數(shù)被聲明為static時(shí),表明該靜態(tài)成員函數(shù)只屬于一個(gè)類,而不屬于該類的任何對(duì)象。因此,在訪問靜態(tài)成員函數(shù)時(shí),最好用類名加作用域運(yùn)算符來(lái)調(diào)用該靜態(tài)成員函數(shù)。對(duì)象名.數(shù)據(jù)成員或類名::數(shù)據(jù)成員第一種方式主要用于非靜態(tài)數(shù)據(jù)成員,第二種主要用于靜態(tài)數(shù)據(jù)成員。第12頁(yè),共29頁(yè),2023年,2月20日,星期四實(shí)際上,當(dāng)某成員函數(shù)只使用靜態(tài)數(shù)據(jù)成員時(shí),應(yīng)該把該成員函數(shù)定義為靜態(tài)成員函數(shù)。這是因?yàn)?,一個(gè)僅使用到靜態(tài)數(shù)據(jù)成員的成員函數(shù)通過某類的對(duì)象來(lái)調(diào)用是沒有任何意義的,且容易造成閱讀上的混淆,閱讀者無(wú)法從程序中直接看出該成員函數(shù)引用了靜態(tài)數(shù)據(jù)成員。因此
A.getC();B.getC();改為:
Point::getC();Point::getC();更為妥當(dāng)。見例5-5(P140)。第13頁(yè),共29頁(yè),2023年,2月20日,星期四另一方面,靜態(tài)成員函數(shù)不屬于某個(gè)對(duì)象的,因此,在靜態(tài)成員函數(shù)訪問非靜態(tài)成員時(shí),必須要指明所要訪問的對(duì)象。例如,若在getC中要訪問非靜態(tài)成員X,則getC必須修改為:見修改后的例5-5析構(gòu)函數(shù)有代碼
staticvoidgetC(Point&p){cout<<"對(duì)象個(gè)數(shù)為:"<<countP<<endl;cout<<“X:”<<X<<endl;//錯(cuò)誤
cout<<“X:"<<p.X<<endl;}則main函數(shù)中的調(diào)用語(yǔ)句改為:
Point::getC(A);Point::getC(B);第14頁(yè),共29頁(yè),2023年,2月20日,星期四6.3友元(friend)前面已講過,一個(gè)對(duì)象的私有數(shù)據(jù)只能通過成員函數(shù)進(jìn)行訪問。這種數(shù)據(jù)封裝的方法雖有許多優(yōu)點(diǎn),但在某些情況下也帶來(lái)許多不便,如某個(gè)函數(shù)需要使用多個(gè)類的多個(gè)相關(guān)數(shù)據(jù),或類Y的所有成員函數(shù)要訪問類X的私有數(shù)據(jù)。出于效率而非技術(shù)的考慮,C++提供了友元(friend)這樣一種輔助手段,允許外面的類或函數(shù)去訪問一個(gè)類的私有數(shù)據(jù)。友元分為兩種情況:將一個(gè)普通函數(shù)聲明為某類的友元和將一個(gè)類聲明為另一個(gè)類的友元。第15頁(yè),共29頁(yè),2023年,2月20日,星期四6.3.1友元函數(shù)
要聲明一個(gè)普通函數(shù)為某類的友元,只要在該類定義中任何一處(不管是private、protected或是public區(qū))提供對(duì)該函數(shù)的聲明,并在其最前方加上關(guān)鍵字friend即可。下面是計(jì)算兩點(diǎn)距離的實(shí)例:classPoint{intX,Y;
friendfloatfdist(Point&p1,Point&p2);//友元函數(shù)public:Point(intxx=0,intyy=0){X=xx;Y=yy;}};第16頁(yè),共29頁(yè),2023年,2月20日,星期四與成員函數(shù)一樣,友元函數(shù)可以在類Point的內(nèi)部定義,也可以在類Point的外部定義。當(dāng)在類外定義時(shí),友元函數(shù)不需要加“類::”。如上述fDist函數(shù)在類Point外定義:doublefDist(Point&p1,Point&p2){doublex=double(p1.X-p2.X);doubley=double(p1.Y-p2.Y);returnsqrt(x*x+y*y);}
見例5-6(P143)第17頁(yè),共29頁(yè),2023年,2月20日,星期四請(qǐng)注意友元函數(shù)與成員函數(shù)在定義和使用上的區(qū)別。成員函數(shù)與友元函數(shù)的主要區(qū)別是成員函數(shù)是屬于某個(gè)類的,而友元函數(shù)不屬于某個(gè)類。在友元函數(shù)中,必須指定所要訪問的對(duì)象,這在三個(gè)地方體現(xiàn)出來(lái):①在參數(shù)中有2個(gè)Point類的引用;在實(shí)現(xiàn)代碼中通過引用對(duì)象p1和“.”來(lái)使用數(shù)據(jù)成員;使用友元函數(shù)(即調(diào)用該友元函數(shù))時(shí)必須有該類對(duì)象作為實(shí)參。第18頁(yè),共29頁(yè),2023年,2月20日,星期四6.2.2友元類我們可以將類A聲明為類B的友元,這樣類A的所有成員函數(shù)就可以訪問類B的私有數(shù)據(jù)。例如:
classA;//一個(gè)類聲明語(yǔ)句
classB{
friendA;//聲明A為B的友元類
inti;voidm_func();};第19頁(yè),共29頁(yè),2023年,2月20日,星期四classA{public:voidf_f1(B&);voidf_f2(B&);......};對(duì)于友元類的成員函數(shù)的使用和定義方式,由于它兼具有類和友元函數(shù)的雙重特點(diǎn),所以它的使用和定義方式頗具特色,具體如下:第20頁(yè),共29頁(yè),2023年,2月20日,星期四
a.由于它是屬于某個(gè)類(A),所以在類外定義時(shí)必須加作用域運(yùn)算符來(lái)限定它屬于某一類(A)的,在使用時(shí)必須加對(duì)象名和成員運(yùn)算符來(lái)指定哪一個(gè)對(duì)象調(diào)用它;
b.由于它是另一個(gè)類(B)的友元,所以在其參數(shù)中必須用該類(B)的對(duì)象和引用作為形參。
c.在實(shí)現(xiàn)代碼上,必須用該類(B)的對(duì)象名加成員運(yùn)算符來(lái)使用該類(B)的私有數(shù)據(jù)。見例(P145)。第21頁(yè),共29頁(yè),2023年,2月20日,星期四友元說明只有在確實(shí)必要時(shí)才應(yīng)使用,即在沒有它時(shí)必須建立一個(gè)復(fù)雜的類等級(jí)的時(shí)候才使用。從性質(zhì)上來(lái)說,友元是一種數(shù)據(jù)共享,它破壞了類的封裝性,因此要盡量少用。在使用友元時(shí)還要注意:(1)友元不具有可傳遞性,如B是A的一個(gè)友元,A是C的一個(gè)友元,并不能得出B是C的友元的結(jié)論。(2)友元關(guān)系是單向的,如果B類是A類的友元,B類的成員函數(shù)可以訪問A類的私有數(shù)據(jù),但A類的成員函數(shù)不能訪問B類的私有數(shù)據(jù)。(3)友元關(guān)系不能被繼承,如果B類是A類的友元,B類的派生類不能自動(dòng)成為A類的友元。第22頁(yè),共29頁(yè),2023年,2月20日,星期四6.4常對(duì)象和常成員(const)雖然數(shù)據(jù)隱藏保證了數(shù)據(jù)的安全性,但各種形式的數(shù)據(jù)共享卻又不同程度地破壞了數(shù)據(jù)的安全。因此,對(duì)于既需要共享、又需要防止改變的數(shù)據(jù)應(yīng)該聲明為常量。因?yàn)槌A吭诔绦蜻\(yùn)行期間是不可改變的,所以可以有效地保護(hù)數(shù)據(jù)。本節(jié)介紹用const定義的常對(duì)象、常成員和常引用。第23頁(yè),共29頁(yè),2023年,2月20日,星期四6.4.1常對(duì)象常對(duì)象是指常類型對(duì)象,即對(duì)象常量,定義的語(yǔ)法形式為:類名const對(duì)象名(初值);或
const類名對(duì)象名(初值);定義常對(duì)象同樣要賦初值,并且該對(duì)象不得再更新。另外,常對(duì)象只能調(diào)用它的常成員函數(shù),而不能調(diào)用其他成員函數(shù)。參見下面的常成員函數(shù)。第24頁(yè),共29頁(yè),2023年,2月20日,星期四6.4.3常成員使用const關(guān)鍵字說明的函數(shù)為常成員函數(shù),常成員函數(shù)據(jù)說明格式如下:
類型說明符
函數(shù)名(參數(shù)表)const;1.常成員函數(shù)注意:
(1)const是函數(shù)類型的一個(gè)組成部分,因此在實(shí)現(xiàn)部分也要帶const關(guān)鍵字,并且可用于對(duì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租房協(xié)議書游戲
- 2025年度個(gè)人住房按揭貸款合同協(xié)議3篇
- 2025年度個(gè)人房產(chǎn)租賃押金返還融資協(xié)議4篇
- 2025年度鋼材貿(mào)易代理與結(jié)算服務(wù)合同
- 2025-2030全球單深位旋轉(zhuǎn)伸縮貨叉行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球奶酪凝乳酶行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球棉籽濃縮蛋白 (CPC)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年軍隊(duì)文職人員招聘考試《教育學(xué)》模擬卷2
- 外教聘請(qǐng)中介合同合同協(xié)議
- 2025年度個(gè)人挖掘機(jī)租賃安全責(zé)任合同4篇
- 2024公路瀝青路面結(jié)構(gòu)內(nèi)部狀況三維探地雷達(dá)快速檢測(cè)規(guī)程
- 浙江省臺(tái)州市2021-2022學(xué)年高一上學(xué)期期末質(zhì)量評(píng)估政治試題 含解析
- 2024年高考真題-地理(河北卷) 含答案
- 中國(guó)高血壓防治指南(2024年修訂版)解讀課件
- 2024年浙江省中考科學(xué)試卷
- 初三科目綜合模擬卷
- 2024風(fēng)力發(fā)電葉片維保作業(yè)技術(shù)規(guī)范
- 《思想道德與法治》課程教學(xué)大綱
- 2024光儲(chǔ)充一體化系統(tǒng)解決方案
- 2024年全國(guó)高考新課標(biāo)卷物理真題(含答案)
- 處理后事授權(quán)委托書
評(píng)論
0/150
提交評(píng)論