面向?qū)ο缶幊碳夹g(shù)第五章_第1頁(yè)
面向?qū)ο缶幊碳夹g(shù)第五章_第2頁(yè)
面向?qū)ο缶幊碳夹g(shù)第五章_第3頁(yè)
面向?qū)ο缶幊碳夹g(shù)第五章_第4頁(yè)
面向?qū)ο缶幊碳夹g(shù)第五章_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο缶幊碳夹g(shù)第五章第1頁(yè),共60頁(yè),2023年,2月20日,星期四程序、軟件中存在大量的實(shí)體對(duì)象如何解決由此產(chǎn)生數(shù)據(jù)訪問控制問題:如作用域;對(duì)象的生命周期;數(shù)據(jù)共享等等提出問題:第2頁(yè),共60頁(yè),2023年,2月20日,星期四本章主要內(nèi)容作用域與可見性對(duì)象的生存期數(shù)據(jù)與函數(shù)靜態(tài)成員友元共享數(shù)據(jù)的保護(hù)編譯預(yù)處理命令多文件結(jié)構(gòu)和工程數(shù)據(jù)訪問數(shù)據(jù)共享程序組織第3頁(yè),共60頁(yè),2023年,2月20日,星期四

數(shù)據(jù)訪問-作用域作用域與可見性的含義。作用域:指標(biāo)示符在源文件中的有效作用范圍可見性:指標(biāo)識(shí)符是否可以引用的問題。

作用域分類函數(shù)原型作用域塊作用域:搞清塊的含義,塊是由{}界定的相對(duì)獨(dú)立一段程序空間類作用域:文件作用域:聯(lián)系與區(qū)別第4頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-可見性可見性是從對(duì)標(biāo)識(shí)符的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域“看”時(shí)能看見什么。如果標(biāo)識(shí)在某處可見,則就可以在該處引用此標(biāo)識(shí)符。第5頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-可見性注意:標(biāo)識(shí)符應(yīng)聲明在先,引用在后。在同一作用域中,不能聲明同名的標(biāo)識(shí)符。如果某個(gè)標(biāo)識(shí)符在外層中聲明,且在內(nèi)層中沒有同一標(biāo)識(shí)符的聲明,則該標(biāo)識(shí)符在內(nèi)層可見。對(duì)于兩個(gè)嵌套的作用域,如在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標(biāo)識(shí)符,則外層作用域的標(biāo)識(shí)符在內(nèi)層不可見。強(qiáng)龍不壓地頭蛇原則第6頁(yè),共60頁(yè),2023年,2月20日,星期四#include<iostream.h>inti;//文件作用域intmain(){i=5;{inti;//塊作用域

i=7;cout<<"i="<<i<<endl;//輸出7}

cout<<"i="<<i;//輸出5

return0;}例5.1返回第7頁(yè),共60頁(yè),2023年,2月20日,星期四函數(shù)原形的作用域函數(shù)原型中的參數(shù),其作用域始于

"(",結(jié)束于")"。例如,設(shè)有下列原型聲明:doubleArea(doubleradius);doubleArea(double);radius的作用域僅在于此,不能用于程序正文其它地方,因而可有可無。doublearea(doubler){return3.14*r*r;}返回與聲明部分的名稱可以不同第8頁(yè),共60頁(yè),2023年,2月20日,星期四塊作用域在塊中聲明的標(biāo)識(shí)符,其作用域自聲明處起,限于塊中,例如:voidfun(inta){intb(a);cin>>b;if(b>0){staticintc;......}}c的作用域b的作用域什么是塊:簡(jiǎn)言之,{……}返回注意:塊內(nèi)定義的靜態(tài)變量,具有”文件作用域”第9頁(yè),共60頁(yè),2023年,2月20日,星期四類作用域類作用域作用于特定的成員名,類及其對(duì)象有特殊的訪問和作用域規(guī)則設(shè)類X,X的對(duì)象x,成員M,X的函數(shù)成員f如f沒有新定義同名標(biāo)識(shí)符M,則在f可以訪問M可以這樣訪問:

X::M(大寫x);x.M(小寫x)

ptr->M(ptr為指向?qū)ο髕的指針)下頁(yè)例子第10頁(yè),共60頁(yè),2023年,2月20日,星期四類作用域classA{public:intb;Staticvoidprt(){Cout<<“test”;Cout<<“b=“<<b<<<endl;…}}可以這樣訪問Aa;a.b=5;a.prt();A::prt();//如果staticprt()則正確可以的

Aa;a::prt();A.b=12;?返回第11頁(yè),共60頁(yè),2023年,2月20日,星期四文件作用域在main()之外,且不在前三者作用域范圍內(nèi)的數(shù)據(jù)具有文件作用域inti,j;……voidmain(){……}請(qǐng)看下頁(yè)第12頁(yè),共60頁(yè),2023年,2月20日,星期四準(zhǔn)確理解作用域整體視圖P123塊作用域類作用域文件作用域問題:1.這種包含關(guān)系什么時(shí)候成立?

2.類作用域一定包含塊作用域嗎?例?返回第13頁(yè),共60頁(yè),2023年,2月20日,星期四main(){……{classpart_cla{public:inta;…voidprt(){…}};}{part_clapc;//出錯(cuò)!此時(shí)類的作用域不包含塊作用域}}返回第14頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-對(duì)象的生存期對(duì)象從產(chǎn)生到結(jié)束的這段時(shí)間就是它的生存期。在對(duì)象生存期內(nèi),對(duì)象將保持它的值,直到被更新為止。P124靜態(tài)生存期動(dòng)態(tài)生存期返回第15頁(yè),共60頁(yè),2023年,2月20日,星期四靜態(tài)生存期定義:生存期與程序的運(yùn)行期相同,稱為靜態(tài)生存期在文件作用域中聲明的對(duì)象具有這種生存期。在函數(shù)內(nèi)部聲明靜態(tài)生存期對(duì)象,用關(guān)鍵字static聲明的對(duì)象。兩種靜態(tài)生存期示例第16頁(yè),共60頁(yè),2023年,2月20日,星期四#include<iostream.h>inti=5;//文件作用域voidout();voidmain(){cout<<"i="<<i<<endl; out(); out();}voidout(){staticct;++ct;cout<<"ct="<<ct<<endl;}注意:i,ct具有靜態(tài)生存期例:返回第17頁(yè),共60頁(yè),2023年,2月20日,星期四動(dòng)態(tài)生存期定義:塊作用域中聲明的對(duì)象是動(dòng)態(tài)生存期的對(duì)象(習(xí)慣稱局部生存期對(duì)象)。開始于程序執(zhí)行到聲明點(diǎn)時(shí),結(jié)束于命名該標(biāo)識(shí)符的作用域結(jié)束處。示例什么是作用域?第18頁(yè),共60頁(yè),2023年,2月20日,星期四#include<iostream.h>voidfun();voidmain(){fun();fun();}voidfun(){staticinta=1;inti=5;a++;i++;cout<<"i="<<i<<",a="<<a<<endl;}運(yùn)行結(jié)果:i=6,a=2i=6,a=3i是動(dòng)態(tài)生存期a是靜態(tài)生存期例第19頁(yè),共60頁(yè),2023年,2月20日,星期四注意:靜態(tài)生存期與程序的生成期相同,一經(jīng)創(chuàng)建,便貫穿始終。

靜態(tài)生存期有局部和全局兩種定義方式動(dòng)態(tài)生存期指臨時(shí)創(chuàng)建,臨時(shí)使用,動(dòng)態(tài)內(nèi)存分配變量的生存期與可見性的討論可見一定生存,但生存未必可見返回聯(lián)系作用域第20頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-數(shù)據(jù)與函數(shù)數(shù)據(jù)存儲(chǔ)在局部對(duì)象中,通過參數(shù)傳遞實(shí)現(xiàn)共享——函數(shù)間的參數(shù)傳遞。數(shù)據(jù)存儲(chǔ)在全局對(duì)象中。將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中。數(shù)據(jù)、代碼結(jié)合方式三種基本方式第21頁(yè),共60頁(yè),2023年,2月20日,星期四voidfunc1(intx){inty;y=x…(1)…intxvoidmain(){……}classA{public:intx;…private:…}(2)返回(3)第22頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-靜態(tài)成員為了解決同類中不同對(duì)象的間的數(shù)據(jù)、函數(shù)(代碼)共享問題。靜態(tài)成員的提出:包括靜態(tài)數(shù)據(jù)成員靜態(tài)函數(shù)成員如何定義第23頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-靜態(tài)成員靜態(tài)數(shù)據(jù)成員用關(guān)鍵字static聲明同類的所有對(duì)象維護(hù)該成員的同一個(gè)拷貝必須在類外定義和初始化,用::域運(yùn)算符來指明所屬的類。靜態(tài)函數(shù)成員第24頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)訪問-靜態(tài)成員靜態(tài)函數(shù)成員用關(guān)鍵字static聲明類外代碼可以使用類名和域操作符來調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)只能引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。訪問非靜態(tài)數(shù)據(jù)成員,必須通過本類的對(duì)象來實(shí)現(xiàn)。為什么?下頁(yè)例子第25頁(yè),共60頁(yè),2023年,2月20日,星期四例子:classa{public:staticintx;staticprt(){cout<<“x=“<<x;};inta::x=0;//對(duì)靜態(tài)成員初始化main(){aa1;a::x=12;a::prt();…a1.x=15;a1.prt();}通過類訪問靜態(tài)成員通過對(duì)象訪問靜態(tài)成員第26頁(yè),共60頁(yè),2023年,2月20日,星期四注意:靜態(tài)數(shù)據(jù)成員要在文件作用域中使用類名做限制性初始化。靜態(tài)數(shù)據(jù)成員的訪問方式:

類名::靜態(tài)數(shù)據(jù)成員或?qū)ο竺?靜態(tài)數(shù)據(jù)成員

(與書上的敘述相悖)靜態(tài)函數(shù)成員的訪問方式:

類名::靜態(tài)數(shù)據(jù)成員或?qū)ο竺?靜態(tài)函數(shù)數(shù)成員

第27頁(yè),共60頁(yè),2023年,2月20日,星期四注意:靜態(tài)函數(shù)成員的訪問對(duì)象:

靜態(tài)數(shù)據(jù)成員、靜態(tài)函數(shù)成員不能訪問非靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)可以直接通過類名::函數(shù)名的方式訪問靜態(tài)數(shù)據(jù)成員,對(duì)非靜態(tài)數(shù)據(jù)成員只能通過對(duì)象名來訪問。參考教材P132你明白嗎?看實(shí)例下頁(yè)例子第28頁(yè),共60頁(yè),2023年,2月20日,星期四ClassA{Public:Staticvoidf(Aa);Private:intx;};VoidA::f(Aa){//cout<<x;錯(cuò)誤cout<<a.x;//正確}返回原因是,靜態(tài)函數(shù)成員可以通過類名訪問,而此時(shí)非靜態(tài)數(shù)據(jù)成員沒有存儲(chǔ)空間第29頁(yè),共60頁(yè),2023年,2月20日,星期四補(bǔ)充:關(guān)于靜態(tài)成員的訪問屬性靜態(tài)成員一般設(shè)成public訪問屬性,否則不能以對(duì)象方式或者類名::靜態(tài)成員名的方式訪問設(shè)成public靜態(tài)成員訪問屬性后,可以用對(duì)象名和類名::方式訪問第30頁(yè),共60頁(yè),2023年,2月20日,星期四例子:classA{public:staticvoidshow(){cout<<"inclassA\""<<endl; }staticintstkk;//可以用對(duì)象名訪問活著類名::成員名形式訪問protected: //staticintstkk;類外:不予許對(duì)象名訪問或者類名::成員名形式訪問private://staticintstkk;不予許對(duì)象名訪問或者類名::成員名形式訪問};intA::stkk=9;voidmain(){Aa;a.stkk=99;cout<<a.stkk<<endl;cout<<A::stkk<<endl;a.show();A::show();}第31頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)共享-友元設(shè)計(jì)思想:

友元,包括友元函數(shù)和友元類,是類和對(duì)象向其它類與對(duì)象開放本類、對(duì)象的的私有、保護(hù)成員的有效途徑。B(A的友元)類AfriendB…Privateorprotect:……第32頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)共享-友元函數(shù)ClassA{public:…friend函數(shù)B聲明…}定義格式:函數(shù)B定義{…}第33頁(yè),共60頁(yè),2023年,2月20日,星期四例:簡(jiǎn)單友元函數(shù)classA{public: A(inti){x=i;} friendvoidacc(A&a);//可以不用引用private: intx;};voidacc(A&a)//可以不用引用,如Aa{cout<<"thexinAis:"<<a.x<<endl;a.x=99;cout<<"thexinAis:"<<a.x<<endl;}intmain(){Aa(9);cout<<a.x<<endl;a.x=99;acc(a);return0;}第34頁(yè),共60頁(yè),2023年,2月20日,星期四例5-6使用友元函數(shù)計(jì)算兩點(diǎn)距離(P135)classPoint //Point類聲明{public: //外部接口

Point(intxx=0,intyy=0){X=xx;Y=yy;} intGetX(){returnX;} intGetY(){returnY;} friendfloatfDist(Pointa,Point&b);private: //私有數(shù)據(jù)成員

intX,Y;};第35頁(yè),共60頁(yè),2023年,2月20日,星期四doublefDist(Point&a,Point&b){doubledx=a.X-b.X;doubledy=a.Y-b.Y;returnsqrt(dx*dx+dy*dy);}intmain(){Pointp1(3.0,5.0),p2(4.0,6.0);doubled=Distance(p1,p2);cout<<"Thedistanceis"<<d<<endl;return0;}第36頁(yè),共60頁(yè),2023年,2月20日,星期四注:友元函數(shù)可以是普通函數(shù),也可以是其它類的成員函數(shù)友元函數(shù)一般定義在類public部分,也可以定義在private部分友元函數(shù)降低了類的封裝性,不利于代碼復(fù)用。第37頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)共享-友元類若一個(gè)類為另一個(gè)類的友元,則此類的所有成員都能訪問對(duì)方類的私有成員(類內(nèi))。聲明語法:將友元類名在另一個(gè)類中使用friend修飾說明。ClasA{friendclassB;Public:…friendclassC;Private:…}第38頁(yè),共60頁(yè),2023年,2月20日,星期四友元類舉例classA{friendclassB;public:voidDisplay(){cout<<x<<endl;}private:intx;};classB{public:voidSet(inti);voidDisplay();private:Aa;};voidB::Set(inti){a.x=i;}voidB::Display(){a.Display();}但是,如:Bb;b.a.x=123;Error:‘a(chǎn)’:cannotaccessprivatememberdeclaredinclass‘B‘為什么?第39頁(yè),共60頁(yè),2023年,2月20日,星期四注:若一個(gè)類為另一個(gè)類的友元,則此類的所有成員函數(shù)都能訪問對(duì)方類的私有成員友元關(guān)系不具有傳遞性、不具有對(duì)稱性,友元關(guān)系是非等價(jià)關(guān)系第40頁(yè),共60頁(yè),2023年,2月20日,星期四數(shù)據(jù)共享-友元分析友元是C++提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機(jī)制。通過將一個(gè)模塊聲明為另一個(gè)模塊的友元,一個(gè)模塊能夠引用到另一個(gè)模塊中被隱藏的信息??梢允褂糜言瘮?shù)和友元類。為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與隱藏的原則,建議盡量不使用或少使用友元。第41頁(yè),共60頁(yè),2023年,2月20日,星期四課堂練習(xí)1.定義一個(gè)date類,通過設(shè)計(jì)一個(gè)友元函數(shù),求兩日期之間的相差的天數(shù)下頁(yè)例程第42頁(yè),共60頁(yè),2023年,2月20日,星期四#include"iostream.h"classdate{friendintdis_of_day(dated1,dated2);public: date(intyear,intmouth,intday) {this->year=year;this->mouth=mouth;this->day=day;}voidout(){cout<<this->year<<""<<mouth<<""<<day<<endl;}private:intyear;intmouth;intday;};第43頁(yè),共60頁(yè),2023年,2月20日,星期四longdis_of_day(dated1,dated2){ longcalc; calc=(d1.year-d2.year)*365+(d1.mouth-d2.mouth)*30+d1.day-d2.day; returncalc;}voidmain(){ dated1(1934,23,12),d2(1934,20,11); d1.out(); d2.out(); cout<<dis_of_day(d1,d2)<<endl;}返回第44頁(yè),共60頁(yè),2023年,2月20日,星期四共享數(shù)據(jù)的保護(hù)-常類型采用如下的共享數(shù)據(jù)保護(hù)措施

常類型的提出:各種形式的數(shù)據(jù)共享破壞了數(shù)據(jù)的隱秘性、數(shù)據(jù)的封裝,如何保護(hù)被共享的數(shù)據(jù)?1.常引用:被引用的對(duì)象不能被更新。2.常對(duì)象:必須進(jìn)行初始化(通過構(gòu)造函數(shù)),不能被更新。3.常類成員:

(1)常數(shù)據(jù)成員通過構(gòu)造函數(shù)初始化

(2)常函數(shù)成員問:什么是更新?第45頁(yè),共60頁(yè),2023年,2月20日,星期四1.常引用voiddisplay(constdouble&r)//常引用做形參,在函數(shù)中不能更新r所引用的對(duì)象。{cout<<r<<endl;

if(r=r)cout<<“ok”<<endl;//r=r或r=9.5;都認(rèn)為錯(cuò)誤,不許更新++r;//出錯(cuò),不予許更新

}例:格式:const類型說明符&引用名第46頁(yè),共60頁(yè),2023年,2月20日,星期四2.常對(duì)象舉例classA{public:intx,y;voidprt(){cout<<“x=:<<x<<“y=:”<<y<<endl;};Aconsta;//a是常對(duì)象,不能被更新main(){cout<<a.x<<endl;//輸出默認(rèn)值a.x=3;//錯(cuò)誤,不許更新只能通過類的構(gòu)造函數(shù)初始化}格式:類名const對(duì)象名例:第47頁(yè),共60頁(yè),2023年,2月20日,星期四3.1常成員函數(shù)#include<iostream.h>classR{public:R(intr1,intr2){R1=r1;R2=r2;}voidprint();voidprint()const;//構(gòu)成重載private:intR1,R2;};格式:成員函數(shù)const

常成員函數(shù)不更新對(duì)象的數(shù)據(jù)成員常對(duì)象只能調(diào)用它的常成員函數(shù)第48頁(yè),共60頁(yè),2023年,2月20日,星期四voidR::print(){cout<<R1<<":"<<R2<<endl;}voidR::print()const{cout<<R1<<";"<<R2<<endl;

R1=11l;//error

}voidmain(){Ra(5,4);a.print();//調(diào)用voidprint()constRb(20,52);b.print();//調(diào)用voidprint()const}第49頁(yè),共60頁(yè),2023年,2月20日,星期四3.2常數(shù)據(jù)成員classA{public: A(inti); voidprint();

constint&r;private: constinta; staticconstintb;//靜態(tài)常數(shù)據(jù)成員};格式:const數(shù)據(jù)成員。常數(shù)據(jù)成員只能通過類的構(gòu)造函數(shù)置初值第50頁(yè),共60頁(yè),2023年,2月20日,星期四constintA::b=10;//靜態(tài)成員賦值A(chǔ)::A(inti):a(i),r(a){}//構(gòu)造函數(shù)賦值voidA::print(){cout<<a<<":"<<b<<":"<<r<<endl;}voidmain(){/*建立對(duì)象a和b,并以100和0作為初值,分別調(diào)用構(gòu)造函數(shù),通過構(gòu)造函數(shù)的初始化列表給對(duì)象的常數(shù)據(jù)成員賦初值*/Aa1(100),a2(0);a1.print();a2.print();}100:10:1000:10:0輸出結(jié)果第51頁(yè),共60頁(yè),2023年,2月20日,星期四注意:1.常引用的所指的“對(duì)象”不能被更新2.常對(duì)象的數(shù)據(jù)成員不允許被更新,通過常對(duì)象只能調(diào)用它的常成員函數(shù),常成員函數(shù)不更新對(duì)象的數(shù)據(jù)成員。3.常成員函數(shù)說明格式中的const是函數(shù)類型的一個(gè)組成部分,在聲明、定義實(shí)現(xiàn)部分都要帶上,const關(guān)鍵字可以形成函數(shù)重載。4.常數(shù)據(jù)成員只能通過類的構(gòu)造函數(shù)置初值。5.const位置問題,除了常函數(shù)成員外,const的位置是靈活的。對(duì)比類靜態(tài)成員第52頁(yè),共60頁(yè),2023年,2月20日,星期四const的位置常引用:[const]類型說明符[const]引用名常對(duì)象:[const]類名[const]對(duì)象名常數(shù)據(jù)成員[const]類型說明符[const]成員名常函數(shù)成員類型說明符函數(shù)名()[c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論