




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第九章
數(shù)據(jù)的共享與保護清華大學鄭莉?qū)W習目標掌握標識符的作用域、生存期與可見性;掌握靜態(tài)類成員的使用;掌握常引用、常對象、常成員的使用。2目錄9.1變量的生存期與作用域9.1.1對象的生存期9.1.2作用域及可見性
9.2同類對象間的數(shù)據(jù)共享——靜態(tài)成員9.2.1靜態(tài)數(shù)據(jù)成員9.2.2靜態(tài)函數(shù)成員3目錄9.3共享數(shù)據(jù)的保護9.3.1常引用9.3.2常成員9.3.3長對象49.1.1對象的生存期對象(包括簡單變量)都有誕生和消失的時刻。所謂對象的生存期就是一個對象在程序運行過程中有效存在的時間,也就是從對象的誕生到對象的消亡這段時間。不同的對象和變量具有不同的生存期,比如全局變量和靜態(tài)變量具有靜態(tài)生存期(靜態(tài)生存期與程序的運行期相同),而局部非靜態(tài)變量有動態(tài)生存期(動態(tài)生存期為對象的聲明開始點到該對象消亡處)。59.1變量的生存期與作用域例9-1:不同變量的生存期#include<iostream>usingnamespacestd;doubleCF=5.1; //全局變量具有靜態(tài)生存期
classexam{public: doubletemp; exam(doublex=0):temp(x){cout<<"constructed"<<endl;}; ~exam(){cout<<"destructed!"<<endl;}};69.1變量的生存期與作用域——9.1.1對象的生存期例9-1(續(xù))intmain(){ intadd_num1(3),add_num2(4);//局部變量,動態(tài)生存期 voidadd(intx,inty); { examtemp(CF); //塊內(nèi)對象具有動態(tài)生存期 cout<<temp.temp<<endl; intx=3; } //對象生命結(jié)束,x變量生命也結(jié)束 add(add_num1,add_num2);}voidadd(intx,inty){ staticintz=3; //局部靜態(tài)變量,具有靜態(tài)生存期 inta=4; //函數(shù)內(nèi)部變量,具有動態(tài)生存期 cout<<"sumis"<<x+y+z+a<<endl;} 79.1變量的生存期與作用域——9.1.1對象的生存期運行結(jié)果:constructed5.1destructed!sumis14例9-1(續(xù))9.1變量的生存期與作用域——9.1.1對象的生存期9.1.2作用域及可見性作用域是指一個標志符在程序中的有效范圍。作用域一般可以分為四個類型:一、函數(shù)原型作用域;二、局部作用域(塊作用域);三、類作用域;四、文件作用域。函數(shù)原型作用域是指在函數(shù)原型聲明時形參的作用范圍。在函數(shù)原型中,如果有形參,則一定要包含形參的類型說明。而形參的作用范圍就在函數(shù)形參列表的左右括號之間,在程序的其他地方不能引用這個標識符,此標識符的作用域成為函數(shù)原型作用域。99.1變量的生存期與作用域9.1.2作用域及可見性(續(xù))局部作用域是指在一個程序塊中或者某個函數(shù)體內(nèi)的作用范圍。如用大括號括起來的程序塊: { inta,b; cin>>a>>b; { intc; } }其中a,b具有第一層的塊作用域,而c在第二層的塊,因此其作用范圍在第二層的塊中,這些都可以稱為局部作用域。109.1變量的生存期與作用域9.1.2作用域及可見性(續(xù))在類中聲明的變量和對象,因為其具有類作用域,我們需要通過“.“運算符或者域運算符“::”來訪問。除了以上各種情況聲明的標識符具有文件作用域,這樣聲明的標識符起作用開始于聲明點,結(jié)束于文件尾。標識符的可見性是指標識符在程序中能否被引用。119.1變量的生存期與作用域9.1.2作用域及可見性(續(xù))作用域的一般關(guān)系。作用域可見性的一般規(guī)則是:標識符要聲明在前,引用在后。在同一作用域中不能聲明同名的標識符。在沒有互相包含關(guān)系的不同的作用域中聲明的同名標識符互不影響。如果在兩個或者多個具有包含關(guān)系的作用域中聲明了同名標識符,外層的標識符在內(nèi)層不可見,或者說外層的同名標識符被隱藏了。程序中能否被引用。129.1變量的生存期與作用域例9-2:作用域與可見性#include<iostream>#include<iomanip>usingnamespacestd;intx=5,y=6; //全局變量,文件作用域
classexam{public:intx; //定義類域中的變量x,類作用域exam():x(y){cout<<"constructed"<<endl;};//沒有聲明同名變量,y可見~exam(){cout<<"destructed!"<<endl;}};139.1變量的生存期與作用域——9.1.2作用域及可見性intmain(){ cout<<setw(3)<<x<<setw(3)<<y<<endl; intx(3),y(2); //聲明同名變量x,y,此時外層x,y不可見, cout<<setw(3)<<x<<setw(3)<<y<<endl; { //程序塊 intx=10; //同名變量x,外層都不可見 cout<<setw(3)<<x<<setw(3)<<y<<endl;//沒有新聲明,y可見 } examtemp; cout<<temp.x<<endl; //類作用域,外層同名變量都不可見 voidadd(); add(); } voidadd(){ intx=4; //定義局部變量x
cout<<"sumis"<<x+y<<endl;//輸出10,x=4,y=6}149.1變量的生存期與作用域——9.1.2作用域及可見性例9-2(續(xù))運行結(jié)果:5632102constructed6sumis10destructed!例9-2(續(xù))9.1變量的生存期與作用域——9.1.2作用域及可見性9.2.1靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是解決同一個類的不同對象之間數(shù)據(jù)和函數(shù)的共享問題。聲明靜態(tài)數(shù)據(jù)成員要采用關(guān)鍵字static。注意靜態(tài)數(shù)據(jù)成員必須在文件作用域的某個地方用類名限定符對靜態(tài)數(shù)據(jù)成員定義并初始化。169.2同類對象間的數(shù)據(jù)共享例9-3:靜態(tài)數(shù)據(jù)成員#include<iostream>#include<string>usingnamespacestd;classStudent{private: intnum; //學號 charname[20];//名字public: staticintcount; //用于計數(shù)的靜態(tài)變量 Student(){count++;}; //構(gòu)造函數(shù) Student(char*,int_num=0);//構(gòu)造函數(shù) voidGetName(); //獲取名字函數(shù) intGetNum(); //獲取學號函數(shù) ~Student(){count--;};//析構(gòu)函數(shù)};179.2同類對象間的數(shù)據(jù)共享——9.2.1靜態(tài)數(shù)據(jù)成員intStudent::count=0; //靜態(tài)變量初始化
Student::Student(char*_name,int_num){ strcpy(name,_name); num=_num; count++; } voidStudent::GetName(){ cout<<name<<endl; }
intStudent::GetNum(){ returnnum;}
189.2同類對象間的數(shù)據(jù)共享——9.2.1靜態(tài)數(shù)據(jù)成員例9-3(續(xù))例9-3(續(xù))intmain(){ Studentstu[2]; cout<<"thenumberofstudentsis:"<<Student::count<<endl; cout<<"thenumberofstudentsis:"<<stu[0].count<<endl; return0;}199.2同類對象間的數(shù)據(jù)共享——9.2.1靜態(tài)數(shù)據(jù)成員運行結(jié)果:thenumberofstudentsis:2thenumberofstudentsis:2例9-3(續(xù))9.2同類對象間的數(shù)據(jù)共享——9.2.1靜態(tài)數(shù)據(jù)成員9.2.2靜態(tài)函數(shù)成員靜態(tài)函數(shù)的聲明在類中用關(guān)鍵字static聲明。靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)和函數(shù)成員。而訪問非靜態(tài)數(shù)據(jù)成員必須通過參數(shù)傳地方式得到對象名,然后通過對象名訪問。219.2同類對象間的數(shù)據(jù)共享例9-4:對靜態(tài)數(shù)據(jù)成員的訪問#include<iostream>#include<string>usingnamespacestd;classStudent{private: intnum; //學號 charname[20];//名字public: staticintcount; //用于計數(shù)的靜態(tài)變量 Student(){count++;}; //構(gòu)造函數(shù) Student(char*,int_num=0);//構(gòu)造函數(shù) voidGetName(); //獲取名字函數(shù) intGetNum(); //獲取學號函數(shù) staticintGetCount(){returncount;}//靜態(tài)成員函數(shù) ~Student(){count--;};//析構(gòu)函數(shù)};229.2同類對象間的數(shù)據(jù)共享——9.2.2靜態(tài)函數(shù)成員intStudent::count=0; //靜態(tài)變量初始化
Student::Student(char*_name,int_num){ strcpy(name,_name); num=_num; count++; }
voidStudent::GetName(){ cout<<name<<endl; }
intStudent::GetNum(){ returnnum;}
239.2同類對象間的數(shù)據(jù)共享——9.2.2靜態(tài)函數(shù)成員例9-4(續(xù))例9-4(續(xù))
intmain(){ Studentstu1,stu2; cout<<"thenumberofstudentsis:"<<Student::GetCount()<<endl; return0;}
249.2同類對象間的數(shù)據(jù)共享——9.2.2靜態(tài)函數(shù)成員運行結(jié)果:thenumberofstudentsis:2例9-4(續(xù))9.2同類對象間的數(shù)據(jù)共享——9.2.2靜態(tài)函數(shù)成員9.3.1常引用類的私有數(shù)據(jù)屬性給數(shù)據(jù)的安全提供了一定的保障,但是數(shù)據(jù)的共享必定帶來數(shù)據(jù)安全隱患,如果不小心很有可能篡改了數(shù)據(jù),影響了數(shù)據(jù)的安全。常引用,在引用時加一個const修飾符,保證引用訪問時不更改該對象。269.3共享數(shù)據(jù)的保護例9-5:常引用#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ inta,b; voidcompare(constint&x,constint&y); //比較函數(shù)的聲明 cout<<"pleaseentertwointeger:"<<endl;
cin>>a>>b; compare(a,b);}
279.3共享數(shù)據(jù)的保護——9.3.1常引用例9-5(續(xù))voidcompare(constint&x,constint&y)//比較函數(shù)的定義{ if(x==y) { cout<<"theyareequal!"<<endl; } elseif(x>y) { cout<<"theformerisbigger"<<endl; } else { cout<<"thelasterisbigger"<<endl; }}289.3共享數(shù)據(jù)的保護——9.3.1常引用運行結(jié)果:pleaseentertwointeger:58thelasterisbigger例9-5(續(xù))9.3共享數(shù)據(jù)的保護——9.3.1常引用9.3.2常成員類的私有數(shù)據(jù)屬性給數(shù)據(jù)的安全提供了一定的保障,但是數(shù)據(jù)的共享必定帶來數(shù)據(jù)安全隱患,如果不小心很有可能篡改了數(shù)據(jù),影響了數(shù)據(jù)的安全。常數(shù)據(jù)成員:使用const說明的數(shù)據(jù)成員。常成員函數(shù)使用const關(guān)鍵字說明的函數(shù)。常成員函數(shù)不更新對象的數(shù)據(jù)成員。常成員函數(shù)說明格式:
類型說明符函數(shù)名(參數(shù)表)const;
這里,const是函數(shù)類型的一個組成部分,因此在實現(xiàn)部分也要帶const關(guān)鍵字。const關(guān)鍵字可以被用于參與對重載函數(shù)的區(qū)分309.3共享數(shù)據(jù)的保護例9-6:常成員數(shù)據(jù)//CircleCal.h#ifndefCircle #defineCircleclassCircleCal{private: doubleRadius; //定義半徑 constdoublePI;public: CircleCal(doubler=0):PI(3.1415)//缺省半徑值,常量的初始化 { Radius=r; }; doubleCal(); //聲明計算面積函數(shù) ~CircleCal(){};};#endif319.3共享數(shù)據(jù)的保護——9.3.2常成員例9-6(續(xù))//CircleCal.cpp#include<iostream>#include<cmath>#include"CircleCal.h"usingnamespacestd;doubleCircleCal::Cal()//定義計算面積的值{ returnpow(Radius,2)*PI;} 329.3共享數(shù)據(jù)的保護——9.3.2常成員例9-6(續(xù))//9_6.cpp#include<iostream>#include<iomanip>#include"CircleCal.h"usingnamespacestd;intmain(){ CircleCalR1(2.5),R2; cout<<"theaeraofR1is:" <<setw(5)<<R1.Cal()<<endl; cout<<"theaeraofR2is:" <<setw(5)<<R2.Cal()<<endl; return0;}339.3共享數(shù)據(jù)的保護——9.3.2常成員運行結(jié)果:theaeraofR1is:19.6344theaeraofR2is:0例9-6(續(xù))9.3共享數(shù)據(jù)的保護——9.3.1常引用例9-7:常成員函數(shù)//CircleCal.h#ifndefCircle #defineCircleclassCircleCal{private: doubleRadius; //定義半徑 constdoublePI;public: CircleCal(doubler=0):PI(3.1415)//缺省半徑值,常量的初始化 { Radius=r; };doubleGetR()const;//聲明常函數(shù) doubleCal(); //聲明計算面積函數(shù) ~CircleCal(){};};#endif359.3共享數(shù)據(jù)的保護——9.3.2常成員例9-7(續(xù))//CircleCal.cpp #include<iostream>#include<cmath>#include"CircleCal.h"usingnamespacestd;doubleCircleCal::Cal()//定義計算面積的值{ returnpow(Radius,2)*PI;} doubleCircleCal::GetR()const//定義常函數(shù)的時候不可將const省去{ Radius=3; //錯誤!不可以改變Radius的值returnRadius;}369.3共享數(shù)據(jù)的保護——9.3.2常成員例9-7(續(xù))//9_7.cpp#include<iostream>#include<iomanip>#include"CircleCal.h"usingnamespacestd;intmain(){ CircleCalR1(2.5),R2; cout<<"theaeraofR1is:" <<setw(5)<<R1.GetR()<<endl; cout<<"theaeraofR2is:" <<setw(5)<<R2.GetR()<<endl; return0;}379.3共享數(shù)據(jù)的保護——9.3.2常成員運行結(jié)果:theaeraofR1is:2.5theaeraofR2is:0例9-7(續(xù))9.3共享數(shù)據(jù)的保護——9.3.1常引用9.3.3常對象常對象就是對象在生存期內(nèi)不可更改的對象。常對象首先需要被初始化,然后使用,在使用過程中,常對象只能調(diào)用常成員函數(shù),因為一切調(diào)用非常成員函數(shù)都視為危險的,即便這個非常成員函數(shù)并沒有修改成員數(shù)據(jù)。399.3共享數(shù)據(jù)的保護例9-8:常對象對函數(shù)的調(diào)用#ifndefCircle#defineCircleclassCircleCal{private: doubleRadius; //定義半徑 staticconstdoublePI;public: CircleCal(){}; CircleCal(double); doubleCal(); //聲明計算面積函數(shù) doubleGetR()const; doubleGetR(); ~CircleCal(){};};#endif409.3共享數(shù)據(jù)的保護——9.3.3常對象例9-8(續(xù))//CircleCal.cpp#include<iostream>#include<cmath>#include"CircleCal.h"usingnamespacestd;constdoub
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理酒合同范例
- 個人屋頂維修合同范例
- 佛山市汽車購買合同范例
- 北京2025年北京海淀區(qū)教委所屬事業(yè)單位招聘438人筆試歷年參考題庫附帶答案詳解
- 三居室房子合同范例
- 低溫設(shè)備采購合同范例
- 農(nóng)田清淤工程合同范例
- oem商標使用合同范例
- 借人用人合同范例
- 買田地合同范例
- 人教版三年級下冊勞動教育《清潔教室衛(wèi)生》
- DL∕T 802.8-2014 電力電纜用導管技術(shù)條件 第8部分:埋地用改性聚丙烯塑料單壁波紋電纜導管
- 反賄賂與反腐敗管理制度
- 2024屆北京市海淀區(qū)小學英語五年級第二學期期末質(zhì)量檢測試題含解析
- 鄉(xiāng)村振興相關(guān)知識備考試題庫(含答案)
- G -B- 43630-2023 塔式和機架式服務(wù)器能效限定值及能效等級(正式版)
- QC/T 1091-2023 客車空氣凈化裝置 (正式版)
- 2024年節(jié)水知識競賽考試題及答案
- 《子路、曾皙、冉有、公西華侍坐》練習及參考答案
- 2024年江蘇醫(yī)藥職業(yè)學院單招職業(yè)適應(yīng)性測試題庫完整
- 1 神州謠 公開課一等獎創(chuàng)新教學設(shè)計
評論
0/150
提交評論