C清華大學(xué)出版社第四版課件第五章.ppt
《C清華大學(xué)出版社第四版課件第五章.ppt》由會員分享,可在線閱讀,更多相關(guān)《C清華大學(xué)出版社第四版課件第五章.ppt(68頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第五章C 程序的結(jié)構(gòu) 東華理工大學(xué)信息工程學(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 局部作用域 函數(shù)的形參 在塊中聲明的標識符 其作用域自聲明處起 限于塊中 例如 voidfun inta intb a cin b if b 0 intc 作用域與可見性 a的作用域 5 類作用域 類作用域作用于特定的成員名 類X的成員m具有類作用域 對m的訪問方式如下 如果在X的成員函數(shù)中沒有聲明同名的局部作用域標識符 那么在該函數(shù)內(nèi)可以訪問成員m 通過表達式x m或者X m訪問 通過表達式ptr M 作用域與可見性 6 命名空間 命名空間可以解決類名 函數(shù)名等的命名沖突命名空間的聲明namespace命名空間名 各種聲明 函數(shù)聲明 類聲明 例namespaceSomeNs classSomeClass 特殊的命名空間全局命名空間 默認的命名空間匿名命名空間 對每個源文件是唯一的 作用域與可見性 命名空間作用域 一個命名空間確定了一個命名空間作用域引用其它命名空間作用域中的標識符命名空間名 標識符名例 聲明一個SomeClass型的對象SomeNs SomeClassobj1 將其它命名空間作用域的標識符暴露于當(dāng)前作用域?qū)χ付俗R符using命名空間名 標識符名 對所有標識符usingnamespace命名空間名 7 作用域與可見性 8 可見性 可見性是從對標識符的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域 看 時能看見什么 如果標識在某處可見 則就可以在該處引用此標識符 作用域與可見性 9 可見性 標識符應(yīng)聲明在先 引用在后 如果某個標識符在外層中聲明 且在內(nèi)層中沒有同一標識符的聲明 則該標識符在內(nèi)層可見 對于兩個嵌套的作用域 如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標識符 則外層作用域的標識符在內(nèi)層不可見 作用域與可見性 10 同一作用域中的同名標識符 在同一作用域內(nèi)的對象名 函數(shù)名 枚舉常量名會隱藏同名的類名或枚舉類型名 重載的函數(shù)可以有相同的函數(shù)名 作用域與可見性 11 includeusingnamespacestd inti 在全局命名空間中的全局變量namespaceNs intj 在Ns命名空間中的全局變量 intmain i 5 為全局變量i賦值Ns j 6 為全局變量j賦值 子塊1usingnamespaceNs 當(dāng)前塊中可以直接引用Ns中的標識符inti 局部變量 局部作用域i 7 cout i i endl 輸出7cout j j endl 輸出6 cout i i endl 輸出5return0 作用域與可見性 例5 1 12 對象的生存期 對象從產(chǎn)生到結(jié)束的這段時間就是它的生存期 在對象生存期內(nèi) 對象將保持它的值 直到被更新為止 13 靜態(tài)生存期 這種生存期與程序的運行期相同 在文件作用域中聲明的對象具有這種生存期 在函數(shù)內(nèi)部聲明靜態(tài)生存期對象 要冠以關(guān)鍵字static 對象的生存期 14 includeusingnamespacestd inti 5 文件作用域intmain cout i i endl return0 i具有靜態(tài)生存期 對象的生存期 例 15 動態(tài)生存期 塊作用域中聲明的 沒有用static修是的對象是動態(tài)生存期的對象 習(xí)慣稱局部生存期對象 開始于程序執(zhí)行到聲明點時 結(jié)束于命名該標識符的作用域結(jié)束處 對象的生存期 16 includeusingnamespacestd voidfun intmain fun fun voidfun staticinta 1 inti 5 a i cout i i a a endl 運行結(jié)果 i 6 a 2i 6 a 3i是動態(tài)生存期a是靜態(tài)生存期 對象的生存期 例 17 例5 2變量的生存期與可見性 includeusingnamespacestd inti 1 i為全局變量 具有靜態(tài)生存期 voidother staticinta 2 staticintb a b為靜態(tài)局部變量 具有全局壽命 局部可見 只第一次進入函數(shù)時被初始化 intc 10 C為局部變量 具有動態(tài)生存期 每次進入函數(shù)時都初始化 a 2 i 32 c 5 cout OTHER n cout i i a a b b c c endl b a 對象的生存期 intmain staticinta 靜態(tài)局部變量 有全局壽命 局部可見 intb 10 b c為局部變量 具有動態(tài)生存期 intc 0 cout MAIN n cout i i a a b b c c endl c 8 other cout MAIN n cout i i a a b b c c endl i 10 other return0 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 20 例5 3具有靜態(tài) 動態(tài)生存期對象的時鐘程序 includeusingnamespacestd classClock 時鐘類定義public 外部接口Clock voidsetTime intnewH intnewM intnewS 三個形參均具有函數(shù)原型作用域voidshowTime private 私有數(shù)據(jù)成員inthour minute second 對象的生存期 Clock Clock hour 0 minute 0 second 0 構(gòu)造函數(shù)voidClock setTime intnewH intnewM intnewS 三個形參均具有局部作用域hour newH minute newM second newS voidClock showTime cout hour minute second endl 20 ClockglobClock 聲明對象globClock 具有靜態(tài)生存期 文件作用域intmain 主函數(shù)cout Firsttimeoutput endl 引用具有文件作用域的對象 globClock showTime 對象的成員函數(shù)具有類作用域globClock setTime 8 30 30 ClockmyClock globClock 聲明具有塊作用域的對象myClockcout Secondtimeoutput endl myClock showTime 引用具有塊作用域的對象return0 21 程序的運行結(jié)果為 Firsttimeoutput 0 0 0Secondtimeoutput 8 30 30 22 24 數(shù)據(jù)與函數(shù) 數(shù)據(jù)存儲在局部對象中 通過參數(shù)傳遞實現(xiàn)共享 函數(shù)間的參數(shù)傳遞 數(shù)據(jù)存儲在全局對象中 將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中 數(shù)據(jù)與函數(shù) 25 使用全局對象 includeusingnamespacestd intglobal voidf global 5 voidg cout global endl intmain f g 輸出 5 return0 數(shù)據(jù)與函數(shù) 26 將函數(shù)與數(shù)據(jù)封裝 includeusingnamespacestd classApplication public voidf voidg private intglobal voidApplication f global 5 voidApplication g cout global endl intmain ApplicationMyApp MyApp f MyApp g return0 數(shù)據(jù)與函數(shù) 27 靜態(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)成員 28 例5 4具有靜態(tài)數(shù)據(jù)成員的Point類 includeusingnamespacestd classPoint public Point intx 0 inty 0 x x y y count Point Point 靜態(tài)成員 Point Point Point 28 30 靜態(tài)成員函數(shù)舉例 includeusingnamespacestd classApplication public staticvoidf staticvoidg private staticintglobal intApplication global 0 voidApplication f global 5 voidApplication g cout global endl intmain Application f Application g return0 靜態(tài)成員 31 靜態(tài)成員函數(shù)舉例 classA public staticvoidf Aa private intx voidA f Aa cout x 對x的引用是錯誤的cout a x 正確 靜態(tài)成員 32 具有靜態(tài)數(shù)據(jù) 函數(shù)成員的Point類 includeusingnamespacestd classPoint Point類定義public 外部接口Point intx 0 inty 0 x x y y count Point Point 靜態(tài)成員 Point Point Point 32 34 友元 友元是C 提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制 通過將一個模塊聲明為另一個模塊的友元 一個模塊能夠引用到另一個模塊中本是被隱藏的信息 可以使用友元函數(shù)和友元類 為了確保數(shù)據(jù)的完整性 及數(shù)據(jù)封裝與隱藏的原則 建議盡量不使用或少使用友元 友元 35 友元函數(shù) 友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾說明的非成員函數(shù) 在它的函數(shù)體中能夠通過對象名訪問private和protected成員作用 增加靈活性 使程序員可以在封裝和快速性方面做合理選擇 訪問對象中的成員必須通過對象名 友元 36 例5 6使用友元函數(shù)計算兩點距離 include includeclassPoint Point類聲明public 外部接口Point intx 0 inty 0 x x y y intgetX returnx intgetY returny friendfloatdist Point 友元 floatdist Point 36 38 友元類 若一個類為另一個類的友元 則此類的所有成員都能訪問對方類的私有成員 聲明語法 將友元類名在另一個類中使用friend修飾說明 友元 39 友元類舉例 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 39 41 友元關(guān)系是單向的 如果聲明B類是A類的友元 B類的成員函數(shù)就可以訪問A類的私有和保護數(shù)據(jù) 但A類的成員函數(shù)卻不能訪問B類的私有 保護數(shù)據(jù) 42 常類型 常類型的對象必須進行初始化 而且不能被更新 常對象 必須進行初始化 不能被更新 const類名對象名常引用 被引用的對象不能被更新 const類型說明符 引用名常數(shù)組 數(shù)組元素不能被更新 下一章介紹 類型說明符const數(shù)組名 大小 常指針 指向常量的指針 下一章介紹 共享數(shù)據(jù)的保護 43 常對象舉例 classA public A inti intj x i 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 7常成員函數(shù)舉例 includeusingnamespacestd classR public R intr1 intr2 r1 r1 r2 r2 voidprint voidprint const private intr1 r2 共享數(shù)據(jù)的保護 voidR print cout r1 r2 endl voidR print const cout r1 r2 endl intmain Ra 5 4 a print 調(diào)用voidprint constRb 20 52 b print 調(diào)用voidprint constreturn0 45 47 例5 8常數(shù)據(jù)成員舉例 includeusingnamespacestd classA public A inti voidprint private constinta staticconstintb 靜態(tài)常數(shù)據(jù)成員 共享數(shù)據(jù)的保護 constintA b 10 A A inti a i voidA print cout a b endl intmain 建立對象a和b 并以100和0作為初值 分別調(diào)用構(gòu)造函數(shù) 通過構(gòu)造函數(shù)的初始化列表給對象的常數(shù)據(jù)成員賦初值 Aa1 100 a2 0 a1 print a2 print return0 47 49 例5 9常引用作形參 include includeusingnamespacestd classPoint Point類定義public 外部接口Point intx 0 inty 0 x x y y intgetX returnx intgetY returny friendfloatdist constPoint 共享數(shù)據(jù)的保護 例5 9常引用作形參 floatdist constPoint 50 共享數(shù)據(jù)的保護 51 編譯預(yù)處理命令 include包含指令將一個源文件嵌入到當(dāng)前源文件中該點處 include按標準方式搜索 文件位于C 系統(tǒng)目錄的include子目錄下 include 文件名 首先在當(dāng)前目錄中搜索 若沒有 再按標準方式搜索 define宏定義指令定義符號常量 很多情況下已被const定義語句取代 定義帶參數(shù)宏 已被內(nèi)聯(lián)函數(shù)取代 undef刪除由 define定義的宏 使之不再起作用 52 條件編譯指令 if和 endif if常量表達式 當(dāng) 常量表達式 非零時編譯程序正文 endif 編譯預(yù)處理命令 53 條件編譯指令 else if常量表達式 當(dāng) 常量表達式 非零時編譯程序正文1 else 當(dāng) 常量表達式 為零時編譯程序正文2 endif 編譯預(yù)處理命令 54 條件編譯指令 elif if常量表達式1程序正文1 當(dāng) 常量表達式1 非零時編譯 elif常量表達式2程序正文2 當(dāng) 常量表達式2 非零時編譯 else程序正文3 其他情況下編譯 endif 編譯預(yù)處理命令 55 條件編譯指令 ifdef標識符程序段1 else程序段2 endif如果 標識符 經(jīng) defined定義過 且未經(jīng)undef刪除 則編譯程序段1 否則編譯程序段2 編譯預(yù)處理命令 56 條件編譯指令 ifndef標識符程序段1 else程序段2 endif如果 標識符 未被定義過 則編譯程序段1 否則編譯程序段2 編譯預(yù)處理命令 57 多文件結(jié)構(gòu) 例5 10 一個源程序可以劃分為多個源文件 類聲明文件 h文件 類實現(xiàn)文件 cpp文件 類的使用文件 main 所在的 cpp文件 利用工程來組合各個文件 58 不使用條件編譯的頭文件 main cpp include file1 h include file2 h intmain file1 h include head h file2 h include head h head h classPoint 多文件結(jié)構(gòu) 59 使用條件編譯的頭文件 head h ifndefHEAD H defineHEAD H classPoint endif 多文件結(jié)構(gòu) 常成員函數(shù)的聲明原則 適當(dāng)?shù)貙⒊蓡T函數(shù)聲明為常成員函數(shù) 能夠提高代碼質(zhì)量 凡是不會改變對象狀態(tài)的函數(shù) 都應(yīng)當(dāng)聲明為常成員函數(shù) 什么是改變對象狀態(tài) 改變對象狀態(tài) 不簡單地等同于改變成員數(shù)據(jù)的值 只要一個成員函數(shù)執(zhí)行與否 不會影響以后接口函數(shù)的調(diào)用結(jié)果 都可以認為它不會改變對象狀態(tài) 60 深度探索 常成員函數(shù)的聲明原則 classLine Line類的定義public 外部接口Line constPoint 61 深度探索 改變數(shù)據(jù)成員 但不改變對象狀態(tài) 常成員函數(shù)的聲明原則 在原則上 應(yīng)當(dāng)將getLen聲明為常成員函數(shù) 但由于修改了數(shù)據(jù)成員的值 語言規(guī)則不允許怎么辦 使用mutable關(guān)鍵字mutable關(guān)鍵字使得被修飾的成員對象無視 常對象的成員對象被視為常對象 這一語言原則Mutable須慎用 62 深度探索 修改后的程序代碼 63 深度探索 classLine Line類的定義public 外部接口Line constPoint 代碼的編譯 編譯 源文件 目標文件源文件的函數(shù)代碼 目標文件的代碼段源文件的靜態(tài)對象 目標文件的數(shù)據(jù)段分為初始化的數(shù)據(jù)段和未初始化的數(shù)據(jù)段符號表 將靜態(tài)對象與函數(shù)的名字與地址關(guān)聯(lián)重定位信息 其它信息 64 深度探索 示例代碼 1 a cppexterninty intfunc intv intmain intz 1 y func z return0 65 深度探索 示例代碼 2 66 func的代碼 push ebpmov esp ebp 代碼段 text x的初值 3 初始化的數(shù)據(jù)段 data y 未初始化的數(shù)據(jù)段 bss 符號表 b o b cppintx 3 inty intfunc intv returnv x 深度探索 代碼的連接與執(zhí)行 連接將各段合并將符號表綜合根據(jù)重定位信息 確定代碼中用到的全局地址代碼的執(zhí)行操作系統(tǒng)首先將文件從磁盤讀入 初始化各段 一些靜態(tài)數(shù)據(jù)就在此時被初始化從引導(dǎo)代碼開始執(zhí)行 引導(dǎo)代碼啟動main main返回后 引導(dǎo)代碼通知操作系統(tǒng)程序結(jié)束 67 深度探索 68 小結(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) 鍵 詞:
- 清華大學(xué)出版社 第四 課件 第五
鏈接地址:http://www.820124.com/p-8297203.html