




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
面向對象編程技術第五章第1頁,共60頁,2023年,2月20日,星期四程序、軟件中存在大量的實體對象如何解決由此產(chǎn)生數(shù)據(jù)訪問控制問題:如作用域;對象的生命周期;數(shù)據(jù)共享等等提出問題:第2頁,共60頁,2023年,2月20日,星期四本章主要內(nèi)容作用域與可見性對象的生存期數(shù)據(jù)與函數(shù)靜態(tài)成員友元共享數(shù)據(jù)的保護編譯預處理命令多文件結構和工程數(shù)據(jù)訪問數(shù)據(jù)共享程序組織第3頁,共60頁,2023年,2月20日,星期四
數(shù)據(jù)訪問-作用域作用域與可見性的含義。作用域:指標示符在源文件中的有效作用范圍可見性:指標識符是否可以引用的問題。
作用域分類函數(shù)原型作用域塊作用域:搞清塊的含義,塊是由{}界定的相對獨立一段程序空間類作用域:文件作用域:聯(lián)系與區(qū)別第4頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-可見性可見性是從對標識符的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域“看”時能看見什么。如果標識在某處可見,則就可以在該處引用此標識符。第5頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-可見性注意:標識符應聲明在先,引用在后。在同一作用域中,不能聲明同名的標識符。如果某個標識符在外層中聲明,且在內(nèi)層中沒有同一標識符的聲明,則該標識符在內(nèi)層可見。對于兩個嵌套的作用域,如在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內(nèi)層不可見。強龍不壓地頭蛇原則第6頁,共60頁,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頁,共60頁,2023年,2月20日,星期四函數(shù)原形的作用域函數(shù)原型中的參數(shù),其作用域始于
"(",結束于")"。例如,設有下列原型聲明:doubleArea(doubleradius);doubleArea(double);radius的作用域僅在于此,不能用于程序正文其它地方,因而可有可無。doublearea(doubler){return3.14*r*r;}返回與聲明部分的名稱可以不同第8頁,共60頁,2023年,2月20日,星期四塊作用域在塊中聲明的標識符,其作用域自聲明處起,限于塊中,例如:voidfun(inta){intb(a);cin>>b;if(b>0){staticintc;......}}c的作用域b的作用域什么是塊:簡言之,{……}返回注意:塊內(nèi)定義的靜態(tài)變量,具有”文件作用域”第9頁,共60頁,2023年,2月20日,星期四類作用域類作用域作用于特定的成員名,類及其對象有特殊的訪問和作用域規(guī)則設類X,X的對象x,成員M,X的函數(shù)成員f如f沒有新定義同名標識符M,則在f可以訪問M可以這樣訪問:
X::M(大寫x);x.M(小寫x)
ptr->M(ptr為指向對象x的指針)下頁例子第10頁,共60頁,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頁,共60頁,2023年,2月20日,星期四文件作用域在main()之外,且不在前三者作用域范圍內(nèi)的數(shù)據(jù)具有文件作用域inti,j;……voidmain(){……}請看下頁第12頁,共60頁,2023年,2月20日,星期四準確理解作用域整體視圖P123塊作用域類作用域文件作用域問題:1.這種包含關系什么時候成立?
2.類作用域一定包含塊作用域嗎?例?返回第13頁,共60頁,2023年,2月20日,星期四main(){……{classpart_cla{public:inta;…voidprt(){…}};}{part_clapc;//出錯!此時類的作用域不包含塊作用域}}返回第14頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-對象的生存期對象從產(chǎn)生到結束的這段時間就是它的生存期。在對象生存期內(nèi),對象將保持它的值,直到被更新為止。P124靜態(tài)生存期動態(tài)生存期返回第15頁,共60頁,2023年,2月20日,星期四靜態(tài)生存期定義:生存期與程序的運行期相同,稱為靜態(tài)生存期在文件作用域中聲明的對象具有這種生存期。在函數(shù)內(nèi)部聲明靜態(tài)生存期對象,用關鍵字static聲明的對象。兩種靜態(tài)生存期示例第16頁,共60頁,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頁,共60頁,2023年,2月20日,星期四動態(tài)生存期定義:塊作用域中聲明的對象是動態(tài)生存期的對象(習慣稱局部生存期對象)。開始于程序執(zhí)行到聲明點時,結束于命名該標識符的作用域結束處。示例什么是作用域?第18頁,共60頁,2023年,2月20日,星期四#include<iostream.h>voidfun();voidmain(){fun();fun();}voidfun(){staticinta=1;inti=5;a++;i++;cout<<"i="<<i<<",a="<<a<<endl;}運行結果:i=6,a=2i=6,a=3i是動態(tài)生存期a是靜態(tài)生存期例第19頁,共60頁,2023年,2月20日,星期四注意:靜態(tài)生存期與程序的生成期相同,一經(jīng)創(chuàng)建,便貫穿始終。
靜態(tài)生存期有局部和全局兩種定義方式動態(tài)生存期指臨時創(chuàng)建,臨時使用,動態(tài)內(nèi)存分配變量的生存期與可見性的討論可見一定生存,但生存未必可見返回聯(lián)系作用域第20頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-數(shù)據(jù)與函數(shù)數(shù)據(jù)存儲在局部對象中,通過參數(shù)傳遞實現(xiàn)共享——函數(shù)間的參數(shù)傳遞。數(shù)據(jù)存儲在全局對象中。將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中。數(shù)據(jù)、代碼結合方式三種基本方式第21頁,共60頁,2023年,2月20日,星期四voidfunc1(intx){inty;y=x…(1)…intxvoidmain(){……}classA{public:intx;…private:…}(2)返回(3)第22頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-靜態(tài)成員為了解決同類中不同對象的間的數(shù)據(jù)、函數(shù)(代碼)共享問題。靜態(tài)成員的提出:包括靜態(tài)數(shù)據(jù)成員靜態(tài)函數(shù)成員如何定義第23頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-靜態(tài)成員靜態(tài)數(shù)據(jù)成員用關鍵字static聲明同類的所有對象維護該成員的同一個拷貝必須在類外定義和初始化,用::域運算符來指明所屬的類。靜態(tài)函數(shù)成員第24頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)訪問-靜態(tài)成員靜態(tài)函數(shù)成員用關鍵字static聲明類外代碼可以使用類名和域操作符來調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)只能引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。訪問非靜態(tài)數(shù)據(jù)成員,必須通過本類的對象來實現(xiàn)。為什么?下頁例子第25頁,共60頁,2023年,2月20日,星期四例子:classa{public:staticintx;staticprt(){cout<<“x=“<<x;};inta::x=0;//對靜態(tài)成員初始化main(){aa1;a::x=12;a::prt();…a1.x=15;a1.prt();}通過類訪問靜態(tài)成員通過對象訪問靜態(tài)成員第26頁,共60頁,2023年,2月20日,星期四注意:靜態(tài)數(shù)據(jù)成員要在文件作用域中使用類名做限制性初始化。靜態(tài)數(shù)據(jù)成員的訪問方式:
類名::靜態(tài)數(shù)據(jù)成員或對象名.靜態(tài)數(shù)據(jù)成員
(與書上的敘述相悖)靜態(tài)函數(shù)成員的訪問方式:
類名::靜態(tài)數(shù)據(jù)成員或對象名.靜態(tài)函數(shù)數(shù)成員
第27頁,共60頁,2023年,2月20日,星期四注意:靜態(tài)函數(shù)成員的訪問對象:
靜態(tài)數(shù)據(jù)成員、靜態(tài)函數(shù)成員不能訪問非靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)可以直接通過類名::函數(shù)名的方式訪問靜態(tài)數(shù)據(jù)成員,對非靜態(tài)數(shù)據(jù)成員只能通過對象名來訪問。參考教材P132你明白嗎?看實例下頁例子第28頁,共60頁,2023年,2月20日,星期四ClassA{Public:Staticvoidf(Aa);Private:intx;};VoidA::f(Aa){//cout<<x;錯誤cout<<a.x;//正確}返回原因是,靜態(tài)函數(shù)成員可以通過類名訪問,而此時非靜態(tài)數(shù)據(jù)成員沒有存儲空間第29頁,共60頁,2023年,2月20日,星期四補充:關于靜態(tài)成員的訪問屬性靜態(tài)成員一般設成public訪問屬性,否則不能以對象方式或者類名::靜態(tài)成員名的方式訪問設成public靜態(tài)成員訪問屬性后,可以用對象名和類名::方式訪問第30頁,共60頁,2023年,2月20日,星期四例子:classA{public:staticvoidshow(){cout<<"inclassA\""<<endl; }staticintstkk;//可以用對象名訪問活著類名::成員名形式訪問protected: //staticintstkk;類外:不予許對象名訪問或者類名::成員名形式訪問private://staticintstkk;不予許對象名訪問或者類名::成員名形式訪問};intA::stkk=9;voidmain(){Aa;a.stkk=99;cout<<a.stkk<<endl;cout<<A::stkk<<endl;a.show();A::show();}第31頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)共享-友元設計思想:
友元,包括友元函數(shù)和友元類,是類和對象向其它類與對象開放本類、對象的的私有、保護成員的有效途徑。B(A的友元)類AfriendB…Privateorprotect:……第32頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)共享-友元函數(shù)ClassA{public:…friend函數(shù)B聲明…}定義格式:函數(shù)B定義{…}第33頁,共60頁,2023年,2月20日,星期四例:簡單友元函數(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頁,共60頁,2023年,2月20日,星期四例5-6使用友元函數(shù)計算兩點距離(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頁,共60頁,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頁,共60頁,2023年,2月20日,星期四注:友元函數(shù)可以是普通函數(shù),也可以是其它類的成員函數(shù)友元函數(shù)一般定義在類public部分,也可以定義在private部分友元函數(shù)降低了類的封裝性,不利于代碼復用。第37頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)共享-友元類若一個類為另一個類的友元,則此類的所有成員都能訪問對方類的私有成員(類內(nèi))。聲明語法:將友元類名在另一個類中使用friend修飾說明。ClasA{friendclassB;Public:…friendclassC;Private:…}第38頁,共60頁,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頁,共60頁,2023年,2月20日,星期四注:若一個類為另一個類的友元,則此類的所有成員函數(shù)都能訪問對方類的私有成員友元關系不具有傳遞性、不具有對稱性,友元關系是非等價關系第40頁,共60頁,2023年,2月20日,星期四數(shù)據(jù)共享-友元分析友元是C++提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制。通過將一個模塊聲明為另一個模塊的友元,一個模塊能夠引用到另一個模塊中被隱藏的信息??梢允褂糜言瘮?shù)和友元類。為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與隱藏的原則,建議盡量不使用或少使用友元。第41頁,共60頁,2023年,2月20日,星期四課堂練習1.定義一個date類,通過設計一個友元函數(shù),求兩日期之間的相差的天數(shù)下頁例程第42頁,共60頁,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頁,共60頁,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頁,共60頁,2023年,2月20日,星期四共享數(shù)據(jù)的保護-常類型采用如下的共享數(shù)據(jù)保護措施
常類型的提出:各種形式的數(shù)據(jù)共享破壞了數(shù)據(jù)的隱秘性、數(shù)據(jù)的封裝,如何保護被共享的數(shù)據(jù)?1.常引用:被引用的對象不能被更新。2.常對象:必須進行初始化(通過構造函數(shù)),不能被更新。3.常類成員:
(1)常數(shù)據(jù)成員通過構造函數(shù)初始化
(2)常函數(shù)成員問:什么是更新?第45頁,共60頁,2023年,2月20日,星期四1.常引用voiddisplay(constdouble&r)//常引用做形參,在函數(shù)中不能更新r所引用的對象。{cout<<r<<endl;
if(r=r)cout<<“ok”<<endl;//r=r或r=9.5;都認為錯誤,不許更新++r;//出錯,不予許更新
}例:格式:const類型說明符&引用名第46頁,共60頁,2023年,2月20日,星期四2.常對象舉例classA{public:intx,y;voidprt(){cout<<“x=:<<x<<“y=:”<<y<<endl;};Aconsta;//a是常對象,不能被更新main(){cout<<a.x<<endl;//輸出默認值a.x=3;//錯誤,不許更新只能通過類的構造函數(shù)初始化}格式:類名const對象名例:第47頁,共60頁,2023年,2月20日,星期四3.1常成員函數(shù)#include<iostream.h>classR{public:R(intr1,intr2){R1=r1;R2=r2;}voidprint();voidprint()const;//構成重載private:intR1,R2;};格式:成員函數(shù)const
常成員函數(shù)不更新對象的數(shù)據(jù)成員常對象只能調(diào)用它的常成員函數(shù)第48頁,共60頁,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頁,共60頁,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ù)成員只能通過類的構造函數(shù)置初值第50頁,共60頁,2023年,2月20日,星期四constintA::b=10;//靜態(tài)成員賦值A::A(inti):a(i),r(a){}//構造函數(shù)賦值voidA::print(){cout<<a<<":"<<b<<":"<<r<<endl;}voidmain(){/*建立對象a和b,并以100和0作為初值,分別調(diào)用構造函數(shù),通過構造函數(shù)的初始化列表給對象的常數(shù)據(jù)成員賦初值*/Aa1(100),a2(0);a1.print();a2.print();}100:10:1000:10:0輸出結果第51頁,共60頁,2023年,2月20日,星期四注意:1.常引用的所指的“對象”不能被更新2.常對象的數(shù)據(jù)成員不允許被更新,通過常對象只能調(diào)用它的常成員函數(shù),常成員函數(shù)不更新對象的數(shù)據(jù)成員。3.常成員函數(shù)說明格式中的const是函數(shù)類型的一個組成部分,在聲明、定義實現(xiàn)部分都要帶上,const關鍵字可以形成函數(shù)重載。4.常數(shù)據(jù)成員只能通過類的構造函數(shù)置初值。5.const位置問題,除了常函數(shù)成員外,const的位置是靈活的。對比類靜態(tài)成員第52頁,共60頁,2023年,2月20日,星期四const的位置常引用:[const]類型說明符[const]引用名常對象:[const]類名[const]對象名常數(shù)據(jù)成員[const]類型說明符[const]成員名常函數(shù)成員類型說明符函數(shù)名()[c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國隧道工程行業(yè)發(fā)展趨勢規(guī)劃研究報告
- 2025-2030年中國鍛壓機械制造行業(yè)運行現(xiàn)狀及未來投資發(fā)展研究報告
- 2025-2030年中國金屬鎂產(chǎn)業(yè)十三五規(guī)劃及發(fā)展趨勢分析報告
- 2025-2030年中國金屬天花產(chǎn)業(yè)運營趨勢及投資戰(zhàn)略研究報告
- 2025-2030年中國醋酸仲丁酯市場十三五規(guī)劃與投資風險評估報告
- 2025-2030年中國裙帶菜行業(yè)市場運行態(tài)勢及發(fā)展戰(zhàn)略分析報告
- 2025-2030年中國蔬菜飲料市場運行動態(tài)與營銷策略研究報告
- 2025-2030年中國花園式住宅行業(yè)競爭格局及發(fā)展可行性分析報告
- 2025-2030年中國職業(yè)裝市場十三五規(guī)劃與未來發(fā)展前景預測報告
- 2025-2030年中國磚瓦行業(yè)競爭態(tài)勢與營銷策略研究報告
- 烈士褒揚課件教學課件
- 退休延期留用崗位協(xié)議書
- 3.1 歌曲《音階歌》課件(10張內(nèi)嵌音頻)
- 中醫(yī)適宜技術-中藥熱奄包
- 2024年儲能行業(yè)市場全景分析及發(fā)展趨勢展望報告
- 2024-2025學年小學科學五年級下冊青島版(六三制2024)教學設計合集
- 文言文雙文本閱讀:重耳出亡(附答案解析與譯文)
- DL∕T 664-2016 帶電設備紅外診斷應用規(guī)范
- 團體標準-電化學儲能電站能量管理系統(tǒng)技術規(guī)范
- 二年級下冊計算小能手帶答案
- 2024年臨滄市工業(yè)產(chǎn)業(yè)發(fā)展集團限公司招聘2名公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
評論
0/150
提交評論