C語言程序設(shè)計清華大學(xué)鄭莉第五章C程序的結(jié)構(gòu).ppt
《C語言程序設(shè)計清華大學(xué)鄭莉第五章C程序的結(jié)構(gòu).ppt》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計清華大學(xué)鄭莉第五章C程序的結(jié)構(gòu).ppt(58頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第五章C+程序的結(jié)構(gòu),清華大學(xué)鄭莉,C+語言程序設(shè)計,2,本章主要內(nèi)容,作用域與可見性對象的生存期數(shù)據(jù)與函數(shù)靜態(tài)成員共享數(shù)據(jù)的保護友元編譯預(yù)處理命令多文件結(jié)構(gòu)和工程,3,函數(shù)原形的作用域,函數(shù)原型中的參數(shù),其作用域始于(,結(jié)束于)。例如,設(shè)有下列原型聲明:doubleArea(doubleradius);,radius的作用域僅在于此,不能用于程序正文其他地方,因而可有可無。,作用域與可見性,4,塊作用域,在塊中聲明的標識符,其作用域自聲明處起,限于塊中,例如:voidfun(inta)intb(a);cinb;if(b0)intc;.,作用域與可見性,5,類作用域,類作用域作用于特定的成員名。類X的成員M具有類作用域,對M的訪問方式如下:如果在X的成員函數(shù)中沒有聲明同名的局部作用域標識符,那么在該函數(shù)內(nèi)可以訪問成員M。通過表達式x.M或者X:M訪問。通過表達式prt-M,作用域與可見性,6,文件作用域,不在前述各個作用域中出現(xiàn)的聲明,具有文件作用域,這樣聲明的標識符的作用域開始于聲明點,結(jié)束于文件尾。,作用域與可見性,7,可見性,可見性是從對標識符的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域“看”時能看見什么。如果標識在某處可見,則就可以在該處引用此標識符。,作用域與可見性,8,可見性,標識符應(yīng)聲明在先,引用在后。如果某個標識符在外層中聲明,且在內(nèi)層中沒有同一標識符的聲明,則該標識符在內(nèi)層可見。對于兩個嵌套的作用域,如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內(nèi)層不可見。,作用域與可見性,9,同一作用域中的同名標識符,在同一作用域內(nèi)的對象名、函數(shù)名、枚舉常量名會隱藏同名的類名或枚舉類型名。重載的函數(shù)可以有相同的函數(shù)名。,作用域與可見性,10,#includeinti;/文件作用域intmain()i=5;inti;/塊作用域i=7;couti=iendl;/輸出7couti=i;/輸出5return0;,作用域與可見性,例5.1,11,對象的生存期,對象從產(chǎn)生到結(jié)束的這段時間就是它的生存期。在對象生存期內(nèi),對象將保持它的值,直到被更新為止。,12,靜態(tài)生存期,這種生存期與程序的運行期相同。在文件作用域中聲明的對象具有這種生存期。在函數(shù)內(nèi)部聲明靜態(tài)生存期對象,要冠以關(guān)鍵字static。,對象的生存期,13,#includeinti=5;/文件作用域intmain()couti=iendl;return0;i具有靜態(tài)生存期,對象的生存期,例,14,動態(tài)生存期,塊作用域中聲明的,沒有用static修是的對象是動態(tài)生存期的對象(習(xí)慣稱局部生存期對象)。開始于程序執(zhí)行到聲明點時,結(jié)束于命名該標識符的作用域結(jié)束處。,對象的生存期,15,#includevoidfun();intmain()fun();fun();voidfun()staticinta=1;inti=5;a+;i+;couti=i,a=aendl;,運行結(jié)果:i=6,a=2i=6,a=3i是動態(tài)生存期a是靜態(tài)生存期,對象的生存期,例,16,例5-2變量的生存期與可見性,#includeinti=1;/i為全局變量,具有靜態(tài)生存期。intmain()staticinta;/靜態(tài)局部變量,有全局壽命,局部可見。intb=-10;/b,c為局部變量,具有動態(tài)生存期。intc=0;voidother(void);cout-MAIN-n;couti:ia:ab:bc:cendl;c=c+8;other();cout-MAIN-n;couti:ia:ab:bc:cendl;i=i+10;other();,對象的生存期,voidother(void)staticinta=2;staticintb;/a,b為靜態(tài)局部變量,具有全局壽命,局部可見。/只第一次進入函數(shù)時被初始化。intc=10;/C為局部變量,具有動態(tài)生存期,/每次進入函數(shù)時都初始化。a=a+2;i=i+32;c=c+5;cout-OTHER-n;couti:ia:ab:bc:cendl;b=a;,17,運行結(jié)果:-MAIN-i:1a:0b:-10c:0-OTHER-i:33a:4b:0c:15-MAIN-i:33a:0b:-10c:8-OTHER-i:75a:6b:4c:15,18,19,例5-3具有靜態(tài)、動態(tài)生存期對象的時鐘程序,#includeclassClock/時鐘類聲明public:/外部接口Clock();voidSetTime(intNewH,intNewM,intNewS);/三個形參均具有函數(shù)原型作用域voidShowTime();Clock()private:/私有數(shù)據(jù)成員intHour,Minute,Second;,對象的生存期,/時鐘類成員函數(shù)實現(xiàn)Clock:Clock()/構(gòu)造函數(shù)Hour=0;Minute=0;Second=0;voidClock:SetTime(intNewH,intNewM,intNewS)Hour=NewH;Minute=NewM;Second=NewS;voidClock:ShowTime()coutHour:Minute:Secondendl;,20,ClockglobClock;/聲明對象globClock,/具有靜態(tài)生存期,文件作用域intmain()/主函數(shù)coutFirsttimeoutput:endl;/引用具有文件作用域的對象:globClock.ShowTime();/對象的成員函數(shù)具有類作用域globClock.SetTime(8,30,30);ClockmyClock(globClock);/聲明具有塊作用域的對象myClockcoutSecondtimeoutput:endl;myClock.ShowTime();/引用具有塊作用域的對象,21,程序的運行結(jié)果為:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:30,22,23,數(shù)據(jù)與函數(shù),數(shù)據(jù)存儲在局部對象中,通過參數(shù)傳遞實現(xiàn)共享函數(shù)間的參數(shù)傳遞。數(shù)據(jù)存儲在全局對象中。將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中。,數(shù)據(jù)與函數(shù),24,使用全局對象,#includeintglobal;voidf()global=5;voidg()coutglobalendl;intmain()f();g();/輸出“5”return0;,數(shù)據(jù)與函數(shù),25,將函數(shù)與數(shù)據(jù)封裝,#includeclassApplicationpublic:voidf();voidg();private:intglobal;voidApplication:f()global=5;voidApplication:g()coutglobalendl;,intmain()ApplicationMyApp;MyApp.f();MyApp.g();return0;,數(shù)據(jù)與函數(shù),26,靜態(tài)成員,靜態(tài)數(shù)據(jù)成員用關(guān)鍵字static聲明該類的所有對象維護該成員的同一個拷貝必須在類外定義和初始化,用(:)來指明所屬的類。靜態(tài)成員函數(shù)類外代碼可以使用類名和作用域操作符來調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)只能直接引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。,靜態(tài)成員,27,例5-4具有靜態(tài)數(shù)據(jù)成員的Point類,#includeusingnamespacestd;classPointpublic:Point(intxx=0,intyy=0)X=xx;Y=yy;countP+;Point(Point,靜態(tài)成員,Point:Point(Point,28,29,靜態(tài)成員函數(shù)舉例,#includeclassApplicationpublic:staticvoidf();staticvoidg();private:staticintglobal;intApplication:global=0;,voidApplication:f()global=5;voidApplication:g()coutglobalendl;intmain()Application:f();Application:g();return0;,靜態(tài)成員,30,靜態(tài)成員函數(shù)舉例,classApublic:staticvoidf(Aa);private:intx;voidA:f(Aa)coutx;/對x的引用是錯誤的couta.x;/正確,靜態(tài)成員,31,具有靜態(tài)數(shù)據(jù)、函數(shù)成員的Point類,#includeclassPoint/Point類聲明public:/外部接口Point(intxx=0,intyy=0)X=xx;Y=yy;countP+;Point(Point,靜態(tài)成員,Point:Point(Point/輸出對象號,類名引用,32,33,友元,友元是C+提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制。通過將一個模塊聲明為另一個模塊的友元,一個模塊能夠引用到另一個模塊中本是被隱藏的信息。可以使用友元函數(shù)和友元類。為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與隱藏的原則,建議盡量不使用或少使用友元。,友元,34,友元函數(shù),友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾說明的非成員函數(shù),在它的函數(shù)體中能夠通過對象名訪問private和protected成員作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。訪問對象中的成員必須通過對象名。,友元,35,例5-6使用友元函數(shù)計算兩點距離,#include#includeclassPoint/Point類聲明public:/外部接口Point(intxx=0,intyy=0)X=xx;Y=yy;intGetX()returnX;intGetY()returnY;friendfloatDistance(Point,友元,doubleDistance(Point,36,37,友元類,若一個類為另一個類的友元,則此類的所有成員都能訪問對方類的私有成員。聲明語法:將友元類名在另一個類中使用friend修飾說明。,友元,38,友元類舉例,classAfriendclassB;public:voidDisplay()coutxendl;private:intx;classBpublic:voidSet(inti);voidDisplay();private:Aa;,友元,voidB:Set(inti)a.x=i;voidB:Display()a.Display();,39,40,友元關(guān)系是單向的,如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有、保護數(shù)據(jù)。,41,常類型,常類型的對象必須進行初始化,而且不能被更新。常引用:被引用的對象不能被更新。const類型說明符y=j;.private:intx,y;Aconsta(3,4);/a是常對象,不能被更新,共享數(shù)據(jù)的保護,44,用const修飾的對象成員,常成員函數(shù)使用const關(guān)鍵字說明的函數(shù)。常成員函數(shù)不更新對象的數(shù)據(jù)成員。常成員函數(shù)說明格式:類型說明符函數(shù)名(參數(shù)表)const;這里,const是函數(shù)類型的一個組成部分,因此在實現(xiàn)部分也要帶const關(guān)鍵字。const關(guān)鍵字可以被用于參與對重載函數(shù)的區(qū)分通過常對象只能調(diào)用它的常成員函數(shù)。常數(shù)據(jù)成員使用const說明的數(shù)據(jù)成員。,共享數(shù)據(jù)的保護,45,例5-8常成員函數(shù)舉例,#includeclassRpublic:R(intr1,intr2)R1=r1;R2=r2;voidprint();voidprint()const;private:intR1,R2;,共享數(shù)據(jù)的保護,voidR:print()coutR1:R2endl;voidR:print()constcoutR1;R2endl;intmain()Ra(5,4);a.print();/調(diào)用voidprint()constRb(20,52);b.print();/調(diào)用voidprint()const,46,47,例5-9常數(shù)據(jù)成員舉例,#includeclassApublic:A(inti);voidprint();constint,共享數(shù)據(jù)的保護,constintA:b=10;A:A(inti):a(i),r(a)/?voidA:print()couta:b:rendl;intmain()/*建立對象a和b,并以100和0作為初值,分別調(diào)用構(gòu)造函數(shù),通過構(gòu)造函數(shù)的初始化列表給對象的常數(shù)據(jù)成員賦初值*/Aa1(100),a2(0);a1.print();a2.print();,48,49,編譯預(yù)處理命令,#include包含指令將一個源文件嵌入到當(dāng)前源文件中該點處。#include按標準方式搜索,文件位于C+系統(tǒng)目錄的include子目錄下#include文件名首先在當(dāng)前目錄中搜索,若沒有,再按標準方式搜索。#define宏定義指令定義符號常量,很多情況下已被const定義語句取代。定義帶參數(shù)宏,已被內(nèi)聯(lián)函數(shù)取代。#undef刪除由#define定義的宏,使之不再起作用。,50,條件編譯指令#if和#endif,#if常量表達式/當(dāng)“常量表達式”非零時編譯程序正文#endif.,編譯預(yù)處理命令,51,條件編譯指令#else,#if常量表達式/當(dāng)“常量表達式”非零時編譯程序正文1#else/當(dāng)“常量表達式”為零時編譯程序正文2#endif,編譯預(yù)處理命令,52,條件編譯指令#elif,#if常量表達式1程序正文1/當(dāng)“常量表達式1”非零時編譯#elif常量表達式2程序正文2/當(dāng)“常量表達式2”非零時編譯#else程序正文3/其他情況下編譯#endif,編譯預(yù)處理命令,53,條件編譯指令,#ifdef標識符程序段1#else程序段2#endif如果“標識符”經(jīng)#defined定義過,且未經(jīng)undef刪除,則編譯程序段1,否則編譯程序段2。,編譯預(yù)處理命令,54,條件編譯指令,#ifndef標識符程序段1#else程序段2#endif如果“標識符”未被定義過,則編譯程序段1,否則編譯程序段2。,編譯預(yù)處理命令,55,多文件結(jié)構(gòu)(例5-10),一個源程序可以劃分為多個源文件:類聲明文件(.h文件)類實現(xiàn)文件(.cpp文件)類的使用文件(main()所在的.cpp文件)利用工程來組合各個文件。,56,不使用條件編譯的頭文件,/main.cpp#includefile1.h#includefile2.hintmain()/file1.h#includehead.h,/file2.h#includehead.h/head.hclassPoint,多文件結(jié)構(gòu),57,使用條件編譯的頭文件,/head.h#ifndefHEAD_H#defineHEAD_HclassPoint#endif,多文件結(jié)構(gòu),58,小結(jié)與復(fù)習(xí)建議,主要內(nèi)容作用域與可見性、對象的生存期、數(shù)據(jù)的共享與保護、友元、編譯預(yù)處理命令、多文件結(jié)構(gòu)和工程達到的目標深入理解程序的結(jié)構(gòu)、模塊間的關(guān)系、數(shù)據(jù)共享。實驗任務(wù)實驗五,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語言程序設(shè)計 清華大學(xué) 第五 程序 結(jié)構(gòu)
鏈接地址:http://appdesigncorp.com/p-11494862.html