數(shù)據(jù)的共享與保護(hù)市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第1頁(yè)
數(shù)據(jù)的共享與保護(hù)市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第2頁(yè)
數(shù)據(jù)的共享與保護(hù)市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第3頁(yè)
數(shù)據(jù)的共享與保護(hù)市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第4頁(yè)
數(shù)據(jù)的共享與保護(hù)市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章數(shù)據(jù)共享與保護(hù)基本概念:作用域、可見(jiàn)性及生存期經(jīng)過(guò)以下機(jī)制實(shí)現(xiàn)數(shù)據(jù)共享和共享數(shù)據(jù)保護(hù):局部變量全局變量類(lèi)數(shù)據(jù)組員類(lèi)靜態(tài)組員友元常類(lèi)型數(shù)據(jù)的共享與保護(hù)第1頁(yè)第五章C++程序結(jié)構(gòu)5.1作用域與可見(jiàn)性5.2生存期5.3

數(shù)據(jù)與函數(shù)5.4

靜態(tài)組員5.5

友元5.6

常類(lèi)型5.7

多文件結(jié)構(gòu)和編譯預(yù)處理命令小結(jié)數(shù)據(jù)的共享與保護(hù)第2頁(yè)5.1作用域與可見(jiàn)性作用域討論是標(biāo)識(shí)符有效范圍;可見(jiàn)性是標(biāo)識(shí)符是否能夠引用問(wèn)題數(shù)據(jù)的共享與保護(hù)第3頁(yè)5.1.1作用域什么是作用域:作用域是一個(gè)標(biāo)識(shí)符在程序正文中有效區(qū)域。作用域分類(lèi):函數(shù)原型作用域

局部作用域(塊作用域)類(lèi)作用域命名空間作用域類(lèi)作用域局部作用域作用域關(guān)系圖命名空間作用域數(shù)據(jù)的共享與保護(hù)第4頁(yè)

作用域范圍:開(kāi)始于函數(shù)原型申明左括號(hào)處,結(jié)束于函數(shù)原型申明右括號(hào)處;例:doubleArea(doubleRadius);

函數(shù)原型申明中變量名Radius能夠省略1函數(shù)原型作用域數(shù)據(jù)的共享與保護(hù)第5頁(yè)例5-1:#include<iostream>usingnamespacestd;voidfun(inta){ intb(a); if(b>0) {

intc; ....

}}2塊作用域C作用域b作用域在塊中申明標(biāo)識(shí)符,其作用域從申明處開(kāi)始,一直到塊結(jié)束大括號(hào)為止塊作用域種類(lèi):分支程序、if語(yǔ)句、switch語(yǔ)句以及循環(huán)語(yǔ)句數(shù)據(jù)的共享與保護(hù)第6頁(yè)3類(lèi)作用域

類(lèi)X一個(gè)組員M在以下情況下局部于X,或者說(shuō)含有類(lèi)作用域:*標(biāo)識(shí)符M出現(xiàn)在X組員函數(shù)內(nèi),該組員函數(shù)中沒(méi)有申明同名局部作用域標(biāo)識(shí)符;*在x.M或X::M這么表示式中,其中x為X類(lèi)型對(duì)象;*在ptr->M這么表示式中,其中ptr為指向X類(lèi)型一個(gè)對(duì)象指針;數(shù)據(jù)的共享與保護(hù)第7頁(yè)4.命名空間作用域一個(gè)命名空間確定了一個(gè)命名空間作用域。語(yǔ)法:命名空間名::標(biāo)識(shí)符名例:定義SomeNs域中一個(gè)類(lèi)namespaceSomeNs{classSomeClass{};};申明對(duì)象:SomeNs::someClassobj;為簡(jiǎn)化使用,提供了using語(yǔ)句:using命名空間名::標(biāo)識(shí)符名;

//在當(dāng)前作用域可直接引用該標(biāo)識(shí)符usingnamespace命名空間名;

//在當(dāng)前作用域可直接引用該命名空間任何標(biāo)識(shí)符例:usingnamespacestd;//std::cin簡(jiǎn)寫(xiě)cin數(shù)據(jù)的共享與保護(hù)第8頁(yè)例5-2:作用域與可見(jiàn)性例#include<iostream>usingnamespacestd;inti(3);//全局變量,文件作用域namespaceNs{intj;}voidmain(){cout<<"i0="<<i<<endl;inti=5;//main函數(shù)內(nèi)有效Ns::j=100;

{usingnamespaceNs;cout<<“j=”<<j<<endl;cout<<"i1="<<i<<endl;inti=7;//局部變量,含有塊作用域

cout<<"i2="<<i<<endl;//同名覆蓋,外層i不可見(jiàn)

::i=10;//作用域運(yùn)算符使外層i可見(jiàn)

cout<<"i3="<<::i<<endl;}cout<<“i4=”<<i<<endl;//?內(nèi)層}i0=3j=100i1=5i2=7i3=10i4=5數(shù)據(jù)的共享與保護(hù)第9頁(yè)5.1.2可見(jiàn)性程序運(yùn)行到某一點(diǎn),能夠引用到標(biāo)識(shí)符,就是該處可見(jiàn)標(biāo)識(shí)符。作用域可見(jiàn)性普通規(guī)則:標(biāo)識(shí)符要申明在前,引用在后在同一作用域中,不能申明同名標(biāo)識(shí)符在沒(méi)有相互包含關(guān)系不一樣作用域中申明同名標(biāo)識(shí)符互不影響假如在2個(gè)或多個(gè)含有包含關(guān)系作用域中申明了同名標(biāo)識(shí)符,則外層標(biāo)識(shí)符在內(nèi)層不可見(jiàn)數(shù)據(jù)的共享與保護(hù)第10頁(yè)5.2生存期

*生存期:指變量或?qū)ο髲谋粍?chuàng)建開(kāi)始到被釋放為止時(shí)間*在生存期內(nèi),對(duì)象將保持它狀態(tài)(即數(shù)據(jù)組員值),變量也將保持它值不變,直到它們被更新為止。

數(shù)據(jù)的共享與保護(hù)第11頁(yè)5.2.1靜態(tài)生存期假如對(duì)象生存期與程序運(yùn)行期相同,我們稱(chēng)為含有靜態(tài)生存期。

//在文件作用域中申明對(duì)象都是含有靜態(tài)生存期。假如要在函數(shù)內(nèi)部塊作用域中申明含有靜態(tài)生存期對(duì)象,則要使用關(guān)鍵詞static。比如:staticinti;數(shù)據(jù)的共享與保護(hù)第12頁(yè)5.2.2動(dòng)態(tài)生存期動(dòng)態(tài)生存期對(duì)象誕生于申明點(diǎn),結(jié)束于該標(biāo)識(shí)符作用域結(jié)束處。

除了文件作用域中申明對(duì)象和塊作用域中申明含有靜態(tài)生存期對(duì)象外,其余對(duì)象都含有動(dòng)態(tài)生存期。數(shù)據(jù)的共享與保護(hù)第13頁(yè)#include<iostream>usingnamespacestd;inti=1;//i為全局變量,含有靜態(tài)生存期voidmain(void){ staticinta;//a為靜態(tài)局部變量,含有全局壽命,局部可見(jiàn)

intb=-10;//b,c為局部變量,含有動(dòng)態(tài)生存期

intc=0; voidother(void); cout<<"---Main---\n"; cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl; c=c+8; other(); cout<<"---Main---\n"; cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl; i+=10; other();}例5-3:變量生存期與可見(jiàn)性數(shù)據(jù)的共享與保護(hù)第14頁(yè)voidother(void){staticinta=2;//a,b為靜態(tài)局部變量,含有全局壽命,局部可見(jiàn),只在第一次進(jìn)入時(shí)初始化

staticintb;int&c=i;//c為局部變量,含有動(dòng)態(tài)生存期,每次進(jìn)入時(shí)初始化

a+=2;i+=3;c+=5;cout<<"---Other---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;b=a;}例5-3(續(xù))運(yùn)行結(jié)果:---Main---i:1a:0b:-10c:0---Other---i:9a:4b:0c:9---Main---i:9a:0b:-10c:8---Other---i:27a:6b:4c:27數(shù)據(jù)的共享與保護(hù)第15頁(yè)5.3數(shù)據(jù)與函數(shù)面向?qū)ο蠡舅枷耄簩?shù)據(jù)與處理數(shù)據(jù)函數(shù)封裝在一個(gè)類(lèi)中,以實(shí)現(xiàn)類(lèi)中函數(shù)組員對(duì)數(shù)據(jù)組員訪問(wèn)以及函數(shù)組員之間數(shù)據(jù)共享。函數(shù)之間數(shù)據(jù)共享普通能夠經(jīng)過(guò)局部變量、全局變量、類(lèi)數(shù)據(jù)組員、類(lèi)靜態(tài)組員以及友元來(lái)實(shí)現(xiàn)。類(lèi)數(shù)據(jù)組員能夠被類(lèi)組員函數(shù)共享。數(shù)據(jù)的共享與保護(hù)第16頁(yè)5.3.1局部變量定義:局部變量普通是含有塊(局部)作用域變量,能夠在塊之間(即調(diào)用和被調(diào)用函數(shù)之間)經(jīng)過(guò)參數(shù)進(jìn)行數(shù)據(jù)傳遞。適應(yīng)范圍:少許數(shù)據(jù)共享情況??梢?jiàn)性:變量含有局部作用域,所以在不一樣函數(shù)體局部變量是相互不可見(jiàn),這很好地實(shí)現(xiàn)了函數(shù)之間數(shù)據(jù)隱藏。數(shù)據(jù)的共享與保護(hù)第17頁(yè)5.3.2全局變量定義:全局變量含有文件作用域??梢?jiàn)性:在整個(gè)程序中,除了在定義有同名局部變量塊中之外,都能夠進(jìn)行直接訪問(wèn)。數(shù)據(jù)共享:全局變量能夠被整個(gè)程序各個(gè)函數(shù)共享。數(shù)據(jù)的共享與保護(hù)第18頁(yè)例5-4:全局變量#include<iostream>usingnamespacestd;intglobal;voidf(){ global=5;//在函數(shù)f中給全局變量賦值}voidg(){ cout<<global<<endl;//在函數(shù)g中輸出全局變量值}voidmain(intargc,char*argv[]){ f(); g();global=10;//能夠?qū)?shù)據(jù)進(jìn)行修改

g();}數(shù)據(jù)的共享與保護(hù)第19頁(yè)5.3.3數(shù)據(jù)組員類(lèi)中數(shù)據(jù)組員:通慣用來(lái)描述該類(lèi)中對(duì)象屬性,都設(shè)置為私有類(lèi)型。封裝性:類(lèi)中數(shù)據(jù)組員能夠被同一類(lèi)中任何一個(gè)函數(shù)訪問(wèn),但對(duì)類(lèi)外來(lái)說(shuō),類(lèi)數(shù)據(jù)組員依然是隱藏,到達(dá)了共享與隱藏兩全。數(shù)據(jù)的共享與保護(hù)第20頁(yè)例5-5:把數(shù)據(jù)封裝在類(lèi)中,實(shí)現(xiàn)有限制數(shù)據(jù)共享和保密(C++與C)intglobal;voidf(){global=5;}voidg(){cout<<global<<endl;}voidmain(){f();g();global=10;//正確

g();}classApplication{public:voidf(){global=5;}voidg(){cout<<global<<endl;}private:intglobal;};voidmain(){Applicationa;a.f();a.g();

a.global=30;//錯(cuò)}數(shù)據(jù)的共享與保護(hù)第21頁(yè)5.4靜態(tài)組員目標(biāo):處理數(shù)據(jù)共享問(wèn)題,即不經(jīng)過(guò)全局對(duì)象,而實(shí)現(xiàn)同一個(gè)類(lèi)多個(gè)對(duì)象之間數(shù)據(jù)共享。假如設(shè)計(jì)以下雇員類(lèi):

classemployee{private:intEmpNo;//該變量雇員改變累計(jì)編號(hào)

intID;char*name;….}

如要統(tǒng)計(jì)雇員總數(shù),這個(gè)數(shù)據(jù)存放在什么地方呢?若以類(lèi)外變量來(lái)存放總數(shù),不能實(shí)現(xiàn)類(lèi)封裝。怎樣實(shí)現(xiàn)?數(shù)據(jù)的共享與保護(hù)第22頁(yè)5.4.1靜態(tài)數(shù)據(jù)組員1.特點(diǎn)*靜態(tài)數(shù)據(jù)組員是類(lèi)全部對(duì)象共享組員,而不是某個(gè)對(duì)象組員;*對(duì)多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)組員只存放在一個(gè)地方,供全部對(duì)象使用;*靜態(tài)數(shù)據(jù)組員值對(duì)每個(gè)對(duì)象都是一樣,但其值能夠被任何一個(gè)對(duì)象更新。數(shù)據(jù)的共享與保護(hù)第23頁(yè)靜態(tài)數(shù)據(jù)組員(續(xù)1)2.使用方法*靜態(tài)數(shù)據(jù)組員在定義或說(shuō)明時(shí)前面加上關(guān)鍵字static;

private:staticints;//s是私有靜態(tài)數(shù)據(jù)組員*靜態(tài)數(shù)據(jù)組員是靜態(tài)存放,它有靜態(tài)生存期,必須對(duì)它進(jìn)行初始化;*靜態(tài)數(shù)據(jù)組員初始化與普通數(shù)據(jù)組員初始化不一樣,它定義和初始化在類(lèi)外進(jìn)行,格式以下:

<數(shù)據(jù)類(lèi)型><類(lèi)名>::<靜態(tài)數(shù)據(jù)組員名>=<值>;數(shù)據(jù)的共享與保護(hù)第24頁(yè)<數(shù)據(jù)類(lèi)型><類(lèi)名>::<靜態(tài)數(shù)據(jù)組員名>=<值>;3.注意事項(xiàng)*初始化在類(lèi)體外進(jìn)行,前面不加static,以免與普通靜態(tài)變量或?qū)ο蠡焱?初始化時(shí)不加該組員訪問(wèn)權(quán)限控制符(靜態(tài)數(shù)據(jù)組員初始化位置與訪問(wèn)權(quán)限無(wú)關(guān));*初始化時(shí)使用作用域運(yùn)算符表明它所屬類(lèi);*類(lèi)外對(duì)公有靜態(tài)數(shù)據(jù)組員引用格式:

<類(lèi)名>::<公有靜態(tài)組員名>

或<對(duì)象名>.<公有靜態(tài)組員名>

靜態(tài)數(shù)據(jù)組員(續(xù)2)數(shù)據(jù)的共享與保護(hù)第25頁(yè)例5-6:含有靜態(tài)數(shù)據(jù)組員Point類(lèi)UML類(lèi)圖PointX:intY:int-countP:int=0+Point(xx:int=0,yy:int=0)+Point(p:Point&)+GetX():int+GetY():int+GetC():void數(shù)據(jù)的共享與保護(hù)第26頁(yè)P(yáng)oint::Point(Point&p){X=p.X;Y=p.Y;countP++;}intPoint::countP=0;

//靜態(tài)數(shù)據(jù)組員定義性說(shuō)明和初始化voidmain(){PointA(4,5);cout<<"PointA,"<<A.GetX()<<","<<A.GetY();A.GetC();PointB(A);cout<<"PointB,"<<B.GetX()<<","<<B.GetY();B.GetC();}結(jié)果:PointA,4,5Objectid=1PointB,4,5Objectid=2例:5-6#include<iostream>usingnamespacestd;classPoint{public:Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}Point(Point&p);intGetX(){returnX;}intGetY(){returnY;}voidGetC(){cout<<"Objectid="<<countP<<endl;}private: intX,Y; staticintcountP;};數(shù)據(jù)的共享與保護(hù)第27頁(yè)5.4.2靜態(tài)函數(shù)組員1、作用操作靜態(tài)數(shù)據(jù)組員;2、使用格式<類(lèi)名>::<公有靜態(tài)組員函數(shù)名>(<參數(shù)表>)或:<對(duì)象名>.<公有靜態(tài)組員函數(shù)名>(<參數(shù)表>)3、注意事項(xiàng)靜態(tài)組員函數(shù)實(shí)現(xiàn)中不能直接引用類(lèi)中說(shuō)明非靜態(tài)組員,能夠引用類(lèi)中說(shuō)明靜態(tài)組員;

靜態(tài)組員函數(shù)中要引用非靜態(tài)組員時(shí),能夠經(jīng)過(guò)對(duì)象來(lái)引用;數(shù)據(jù)的共享與保護(hù)第28頁(yè)例5-7:靜態(tài)函數(shù)組員#include<iostream>usingnamespacestd;classM{public:M(inta){A=a;B+=a;}

//公有靜態(tài)組員函數(shù)

staticvoidf1(Mm);private:intA;

staticintB;//私有靜態(tài)數(shù)據(jù)組員B};voidM::f1(Mm){//經(jīng)過(guò)對(duì)象引用非靜態(tài)組員cout<<"A="<<m.A<<endl;//直接引用靜態(tài)組員cout<<"B="<<B<<endl;}intM::B=0;//私有靜態(tài)數(shù)據(jù)組員初始化voidmain(){MP(5),Q(10);M::f1(P);Q.f1(Q);

//調(diào)用靜態(tài)組員函數(shù)//<類(lèi)名>::<靜態(tài)組員函數(shù)名>(<參數(shù)表>)//<對(duì)象名>.<靜態(tài)組員函數(shù)名>(<參數(shù)表>)}結(jié)果:A=5

B=15

A=10

B=15數(shù)據(jù)的共享與保護(hù)第29頁(yè)例5-8:含有靜態(tài)數(shù)據(jù)和函數(shù)組員Point類(lèi)UML類(lèi)圖PointX:intY:int-countP:int=0+Point(xx:int=0,yy:int=0)+GetX():int+GetY():int+Point(p:Point&)<<static>>+GetC():void數(shù)據(jù)的共享與保護(hù)第30頁(yè)例5-8:含有靜態(tài)數(shù)據(jù)組員、靜態(tài)組員函數(shù)Point類(lèi)Point::Point(Point&p){X=p.X;Y=p.Y;countP++;}intPoint::countP=0;//靜態(tài)數(shù)據(jù)組員定義性說(shuō)明和初始化,使用類(lèi)名限定voidmain(){Point::GetC();PointA(4,5);cout<<"PointA,"<<A.GetX()<<","<<A.GetY();A.GetC();PointB(A);cout<<"PointB,"<<B.GetX()<<","<<B.GetY();

Point::GetC();}#include<iostream>usingnamespacestd;classPoint{public:Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}Point(Point&p);intGetX(){returnX;}intGetY(){returnY;}

staticvoidGetC(){cout<<"Objectid="<<countP<<endl;}private:intX,Y;

staticintcountP;};結(jié)果:Objectid=0PointA,4,5Objectid=1PointB,4,5Objectid=2數(shù)據(jù)的共享與保護(hù)第31頁(yè)5.5友元classB{public:B(inti=0):a(i){};voidSet(inti)

{a.x=i;//???a.Display();//??}voidDisplay();private:Aa;};此為組合類(lèi)例,類(lèi)B中內(nèi)嵌了類(lèi)A對(duì)象,但B組員無(wú)法直接訪問(wèn)類(lèi)A私有組員.classA{public:

A(intxx=0){x=xx;}voidDisplay(){cout<<x;}voidSet(intm){x=m;}//其它組員略

private: intx;};數(shù)據(jù)的共享與保護(hù)第32頁(yè)友元1、為何引入友元

友元提供了不一樣類(lèi)或?qū)ο蠼M員函數(shù)之間、類(lèi)組員與普通函數(shù)之間進(jìn)行數(shù)據(jù)共享機(jī)制。使用友元能夠大大提升程序運(yùn)行效率2、使用格式*是一個(gè)定義在類(lèi)外部類(lèi)或普通函數(shù),但需要在類(lèi)體內(nèi)進(jìn)行說(shuō)明(前面加friend關(guān)鍵字);*不是組員函數(shù),但能夠訪問(wèn)類(lèi)中私有組員和保護(hù)組員;3、友元分類(lèi)*友元函數(shù);*友元類(lèi);數(shù)據(jù)的共享與保護(hù)第33頁(yè)5.5.1友元函數(shù)

友元函數(shù)是類(lèi)申明中由關(guān)鍵詞friend修飾非組員函數(shù)。不過(guò)在它函數(shù)體中能夠經(jīng)過(guò)對(duì)象名訪問(wèn)類(lèi)私有和保護(hù)組員。數(shù)據(jù)的共享與保護(hù)第34頁(yè)例5-9:含友元函數(shù)組員Time類(lèi)UML圖形Timehours:intminutes:int+Time(new_hours:int,new_minutes:int)<<friend>>+Time12(time:Time):void<<friend>>+Time24(tim:Time&):void數(shù)據(jù)的共享與保護(hù)第35頁(yè)例5-9:用友元函數(shù)實(shí)現(xiàn)不一樣計(jì)時(shí)方式#include<iostream.h>classTime{public:Time(intnew_hours,intnew_minutes){hours=new_hours;minutes=new_minutes;}

friend

voidTime12(Timetime);

//友元函數(shù)申明,形參為對(duì)象

friend

voidTime24(Time&tim);

//友元函數(shù)申明,形參為引用private:inthours,minutes;};voidTime12(Timetime){if(time.hours>12){time.hours-=12;//經(jīng)過(guò)對(duì)象訪問(wèn)私有數(shù)據(jù)組員

cout<<time.hours<<":"<<time.minutes<<"PM"<<endl;}elsecout<<time.hours<<":"<<time.minutes<<"AM"<<endl;}voidTime24(Time&tim){cout<<tim.hours<<":"<<tim.minutes<<endl;}數(shù)據(jù)的共享與保護(hù)第36頁(yè)例5-9:用友元函數(shù)實(shí)現(xiàn)不一樣計(jì)時(shí)方式(續(xù))voidmain(){Timetime1(20,30),time2(10,45);Time12(time1);Time24(time1);Time12(time2);Time24(time2);}結(jié)果:8:30PM

20:30

10:45AM

10:45數(shù)據(jù)的共享與保護(hù)第37頁(yè)5.5.2友元類(lèi)定義:類(lèi)申明為另一個(gè)類(lèi)友元,稱(chēng)為友元類(lèi)。語(yǔ)法規(guī)則:classB{…friendclassA;//申明A為B友元類(lèi)

…}3.說(shuō)明:*若A類(lèi)為B類(lèi)友元類(lèi),則A類(lèi)全部組員函數(shù)都是B類(lèi)友元函數(shù),都能夠訪問(wèn)B類(lèi)私有和保護(hù)組員。*友元關(guān)系不能傳遞;友元關(guān)系是單向。數(shù)據(jù)的共享與保護(hù)第38頁(yè)例5-10:類(lèi)X和類(lèi)Y友元關(guān)系UML類(lèi)圖說(shuō)明:1.Y類(lèi)是X類(lèi)友元類(lèi);Y類(lèi)全部組員函數(shù)都是X類(lèi)友元函數(shù);2.Y類(lèi)包含了X類(lèi)對(duì)象a;3.Y類(lèi)能夠經(jīng)過(guò)X類(lèi)對(duì)象a訪問(wèn)X類(lèi)全部組員.Xx:int-y:int=1+SetX(i:int):void+Display():voidY+Y(i:int,j:int)+Display():void<<friend>>-a-a:X數(shù)據(jù)的共享與保護(hù)第39頁(yè)例5-10:友元類(lèi)例#include<iostream>usingnamespacestd;classX{

friendclassY;//友元類(lèi)public:voidSet(inti){x=i;}voidDisplay(){cout<<"x="<<x<<","<<"y="<<y<<endl;}private:intx;staticinty;//靜態(tài)數(shù)據(jù)組員引用性說(shuō)明};intX::y=1;//靜態(tài)數(shù)據(jù)組員定義性說(shuō)明和初始化數(shù)據(jù)的共享與保護(hù)第40頁(yè)例5-10:友元類(lèi)例(續(xù))classY{public:Y(inti,intj);voidDisplay();private:Xa;//子對(duì)象,類(lèi)X對(duì)象a作為類(lèi)Y數(shù)據(jù)組員};Y::Y(inti,intj){a.x=i;X::y=j;//類(lèi)Y中訪問(wèn)類(lèi)X私有數(shù)據(jù)組員x和y}voidY::Display(){//類(lèi)Y中訪問(wèn)類(lèi)X私有數(shù)據(jù)組員x和y;

cout<<"x="<<a.x<<",";cout<<"y="<<a.y<<endl;}//用X::y或a.y調(diào)用靜態(tài)數(shù)據(jù)組員voidmain(){Xb;b.Set(5);b.Display();Yc(6,9);c.Display();b.Display();}輸出:

x=5,y=1

x=6,y=9

x=5,y=9

數(shù)據(jù)的共享與保護(hù)第41頁(yè)復(fù)習(xí):inta;voidmain(){staticinta;}

問(wèn):各變量a作用域,生存期,可見(jiàn)性怎樣?

外a:全局,整個(gè)程序,內(nèi)層不可見(jiàn);內(nèi)a:局部,從定義時(shí)到程序結(jié)束,僅內(nèi)層可見(jiàn)2.靜態(tài)數(shù)據(jù)組員特點(diǎn)、定義、初始化、使用方法;全體對(duì)象所共有,不為某一對(duì)象所專(zhuān)有,一但其值被某個(gè)對(duì)象修改,則全部對(duì)象均訪問(wèn)到修改后值。

classA{public:staticinta;}

類(lèi)外:intA::a=1;

使用:Ap;p.a;A::a;3.靜態(tài)組員函數(shù)作用和函數(shù)體寫(xiě)法、調(diào)用;

作用:對(duì)靜態(tài)數(shù)據(jù)組員進(jìn)行操作;函數(shù)體中可直呼其名對(duì)靜態(tài)數(shù)據(jù)組員操作;只能經(jīng)過(guò)對(duì)象操作非靜態(tài)數(shù)據(jù)組員。調(diào)用:經(jīng)過(guò)類(lèi)名或?qū)ο竺烧{(diào)用4.友元函數(shù)特點(diǎn)和定義,友元類(lèi)不是本類(lèi)組員函數(shù),但可經(jīng)過(guò)對(duì)象訪問(wèn)該類(lèi)私有組員在類(lèi)中用friend對(duì)函數(shù)說(shuō)明,調(diào)用時(shí)形參為類(lèi)對(duì)象友元類(lèi)中全部組員函數(shù)自動(dòng)成為該友元函數(shù)數(shù)據(jù)的共享與保護(hù)第42頁(yè)5.6共享數(shù)據(jù)保護(hù)使用常類(lèi)型對(duì)共享數(shù)據(jù)進(jìn)行保護(hù).常類(lèi)型:使用類(lèi)型修飾符const說(shuō)明類(lèi)型;常類(lèi)型變量或?qū)ο笾凳遣荒鼙桓?;定義或說(shuō)明常類(lèi)型時(shí)必須初始化;數(shù)據(jù)的共享與保護(hù)第43頁(yè)5.6.1普通常量和對(duì)象常量1、普通常量(簡(jiǎn)單類(lèi)型常量)格式:

<類(lèi)型說(shuō)明符>const<常量名>或const

<類(lèi)型說(shuō)明符><常量名>例:intconstx=2;

constintx=2;intconsta[3]={1,2,3};或constinta[3]={1,2,3};//數(shù)組元素值是常量,不能更新;數(shù)據(jù)的共享與保護(hù)第44頁(yè)普通常量和對(duì)象常量(續(xù))

2、常對(duì)象格式:<類(lèi)名>const<對(duì)象名>

const<類(lèi)名><對(duì)象名>例:classA{public:A(inti,intj){x=i;y=j;}voidset(inti,intj){x=i;y=j;}private:

intx,y;};voidmain(){Aconsta1(3,4);//a1必須被初始化,且不能被更新a1.set(5,6);//??

}

數(shù)據(jù)的共享與保護(hù)第45頁(yè)5.6.2常指針和常引用1.常指針

char*constptr1=strptr1;//ptr1是一個(gè)常量指針;

ptr1=strptr2;//錯(cuò)誤,ptr1不能夠更新*ptr1=“m”;//正確,ptr1所指向變量能夠更新

constchar*ptr2=strptr1;//ptr2是一個(gè)指向字符串常量指針;

ptr2=strptr2;//正確,ptr2能夠更新*ptr2="m";//錯(cuò)誤,ptr2所指向字符串不能夠更新數(shù)據(jù)的共享與保護(hù)第46頁(yè)常指針和常引用(續(xù)1)2.常引用格式:const

<類(lèi)型說(shuō)明符>&<引用名>例:doublex=1.2;constdouble&v=x;v=12.3;//錯(cuò)誤3、常指針與常引用作用

使用常指針和常引用作為常參數(shù)表明該函數(shù)不會(huì)更新某個(gè)參數(shù)所指向或所引用對(duì)象,并使該函數(shù)含有更大共享數(shù)據(jù)保護(hù)性。數(shù)據(jù)的共享與保護(hù)第47頁(yè)常指針和常引用(續(xù)2)例5-11:常指針用形參

#include<iostream>usingnamespacestd;

constintN=6;//整型常量

voidprint(constint*p,intn);//指向整形常量指針作形參

voidmain(){intarray[N];for(inti=0;i<N;i++)cin>>array[i];print(array,N);//形參為常指針,實(shí)參為普通數(shù)組,單向

}voidprint(constint*p,intn){cout<<"{";for(inti=0;i<N;i++){cout<<*(p+i)<<"";}cout<<"}"<<endl;}輸入:123456輸出:{1,2,3,4,5,6}*(p+i)=i+1;//錯(cuò)數(shù)據(jù)的共享與保護(hù)第48頁(yè)常指針和常引用(續(xù)3)例5-12:常引用作形參

#include<iostream>

usingnamespacestd;

voiddisplay(constdouble&r);//常引用作形參,單向

voidmain(){doubled(9.5);display(d);//形參為常引用,實(shí)參為非常類(lèi)型

}voiddisplay(constdouble&r){inta(34);r=a;//錯(cuò)

cout<<r<<endl;}輸出:9.5數(shù)據(jù)的共享與保護(hù)第49頁(yè)5.6.3用const修飾類(lèi)組員1.常組員函數(shù)格式:<類(lèi)型說(shuō)明符><函數(shù)名>(<參數(shù)表>)const;說(shuō)明:

1)const是函數(shù)類(lèi)型一個(gè)組成部分,在函數(shù)定義部分必須帶有const關(guān)鍵字;

2)常組員函數(shù)不能更新對(duì)象數(shù)據(jù)組員,也不能調(diào)用該類(lèi)沒(méi)有用const修飾組員函數(shù);

3)經(jīng)過(guò)常對(duì)象只能調(diào)用它常組員函數(shù);

4)const關(guān)鍵字能夠被用于參加重載函數(shù)區(qū)分。表組員函數(shù)與對(duì)象之間操作關(guān)系數(shù)據(jù)的共享與保護(hù)第50頁(yè)例5-13:常組員函數(shù)#include<iostream.h>classM{public:M(intx,inty){X=x;Y=y;}voidMove(intx,inty){X=x;Y=y;}voidPrint()const{X=50;//cout<<X<<","<<Y<<endl;}private:intX,Y;};voidmain(){

constMm1(1,2);//常對(duì)象m1m1.Move(3,3);//錯(cuò)誤,常對(duì)象不能操作普通組員函數(shù)

m1.Print();//調(diào)用voidPrint()constMm2(3,4);m2.Move(3,3);//普通對(duì)象能夠操作普通組員函數(shù)

m2.Print();//普通對(duì)象能夠操作常組員函數(shù)}M-X:int-Y:int+M(x:int,y:int)+Move(x:int,y:int):void<<const>>+Print():void錯(cuò),常組員函數(shù)不能更新對(duì)象數(shù)據(jù)組員.數(shù)據(jù)的共享與保護(hù)第51頁(yè)2.常數(shù)據(jù)組員定義:使用const說(shuō)明數(shù)據(jù)組員為常數(shù)據(jù)組員。例:classA{……private:constint&r;}說(shuō)明:

1)常數(shù)據(jù)組員只能經(jīng)過(guò)組員初始化列表方法進(jìn)行初始化;

2)常數(shù)據(jù)組員不能再被更新。數(shù)據(jù)的共享與保護(hù)第52頁(yè)例5-14:常數(shù)據(jù)組員#include<iostream>usingnamespacestd;classA{public:A(inti);voidPrint();

voidmove(inti){a=r=i;}//??private:

constinta;//常量astaticconstintb;//私有常靜態(tài)數(shù)據(jù)組員bconst

int&r;//常引用r};constintA::b=10;//私有常靜態(tài)數(shù)據(jù)組員b初始化,且b不能再被更新A::A(inti):a(i),r(a)

{}//組員初始化列表,常組員(除常靜態(tài)組員外)在此初始化voidA::Print(){cout<<a<<":"<<b<<":"<<r<<endl;}voidmain(){Aa1(100),a2(0)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論