C清華大學(xué)出版社第四版課件第五章.ppt
《C清華大學(xué)出版社第四版課件第五章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C清華大學(xué)出版社第四版課件第五章.ppt(68頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第五章C 程序的結(jié)構(gòu) 東華理工大學(xué)信息工程學(xué)院 C 語言程序設(shè)計(jì) 2 本章主要內(nèi)容 作用域與可見性對(duì)象的生存期數(shù)據(jù)與函數(shù)靜態(tài)成員共享數(shù)據(jù)的保護(hù)友元編譯預(yù)處理命令多文件結(jié)構(gòu)和工程深度探索 3 函數(shù)原形的作用域 函數(shù)原型中的參數(shù) 其作用域始于 結(jié)束于 例如 設(shè)有下列原型聲明 doublearea doubleradius radius的作用域僅在于此 不能用于程序正文其他地方 因而可有可無 作用域與可見性 4 局部作用域 函數(shù)的形參 在塊中聲明的標(biāo)識(shí)符 其作用域自聲明處起 限于塊中 例如 voidfun inta intb a cin b if b 0 intc 作用域與可見性 a的作用域 5 類作用域 類作用域作用于特定的成員名 類X的成員m具有類作用域 對(duì)m的訪問方式如下 如果在X的成員函數(shù)中沒有聲明同名的局部作用域標(biāo)識(shí)符 那么在該函數(shù)內(nèi)可以訪問成員m 通過表達(dá)式x m或者X m訪問 通過表達(dá)式ptr M 作用域與可見性 6 命名空間 命名空間可以解決類名 函數(shù)名等的命名沖突命名空間的聲明namespace命名空間名 各種聲明 函數(shù)聲明 類聲明 例namespaceSomeNs classSomeClass 特殊的命名空間全局命名空間 默認(rèn)的命名空間匿名命名空間 對(duì)每個(gè)源文件是唯一的 作用域與可見性 命名空間作用域 一個(gè)命名空間確定了一個(gè)命名空間作用域引用其它命名空間作用域中的標(biāo)識(shí)符命名空間名 標(biāo)識(shí)符名例 聲明一個(gè)SomeClass型的對(duì)象SomeNs SomeClassobj1 將其它命名空間作用域的標(biāo)識(shí)符暴露于當(dāng)前作用域?qū)χ付?biāo)識(shí)符using命名空間名 標(biāo)識(shí)符名 對(duì)所有標(biāo)識(shí)符usingnamespace命名空間名 7 作用域與可見性 8 可見性 可見性是從對(duì)標(biāo)識(shí)符的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域 看 時(shí)能看見什么 如果標(biāo)識(shí)在某處可見 則就可以在該處引用此標(biāo)識(shí)符 作用域與可見性 9 可見性 標(biāo)識(shí)符應(yīng)聲明在先 引用在后 如果某個(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)層不可見 作用域與可見性 10 同一作用域中的同名標(biāo)識(shí)符 在同一作用域內(nèi)的對(duì)象名 函數(shù)名 枚舉常量名會(huì)隱藏同名的類名或枚舉類型名 重載的函數(shù)可以有相同的函數(shù)名 作用域與可見性 11 includeusingnamespacestd inti 在全局命名空間中的全局變量namespaceNs intj 在Ns命名空間中的全局變量 intmain i 5 為全局變量i賦值Ns j 6 為全局變量j賦值 子塊1usingnamespaceNs 當(dāng)前塊中可以直接引用Ns中的標(biāo)識(shí)符inti 局部變量 局部作用域i 7 cout i i endl 輸出7cout j j endl 輸出6 cout i i endl 輸出5return0 作用域與可見性 例5 1 12 對(duì)象的生存期 對(duì)象從產(chǎn)生到結(jié)束的這段時(shí)間就是它的生存期 在對(duì)象生存期內(nèi) 對(duì)象將保持它的值 直到被更新為止 13 靜態(tài)生存期 這種生存期與程序的運(yùn)行期相同 在文件作用域中聲明的對(duì)象具有這種生存期 在函數(shù)內(nèi)部聲明靜態(tài)生存期對(duì)象 要冠以關(guān)鍵字static 對(duì)象的生存期 14 includeusingnamespacestd inti 5 文件作用域intmain cout i i endl return0 i具有靜態(tài)生存期 對(duì)象的生存期 例 15 動(dòng)態(tài)生存期 塊作用域中聲明的 沒有用static修是的對(duì)象是動(dòng)態(tài)生存期的對(duì)象 習(xí)慣稱局部生存期對(duì)象 開始于程序執(zhí)行到聲明點(diǎn)時(shí) 結(jié)束于命名該標(biāo)識(shí)符的作用域結(jié)束處 對(duì)象的生存期 16 includeusingnamespacestd voidfun intmain 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)生存期 對(duì)象的生存期 例 17 例5 2變量的生存期與可見性 includeusingnamespacestd inti 1 i為全局變量 具有靜態(tài)生存期 voidother staticinta 2 staticintb a b為靜態(tài)局部變量 具有全局壽命 局部可見 只第一次進(jìn)入函數(shù)時(shí)被初始化 intc 10 C為局部變量 具有動(dòng)態(tài)生存期 每次進(jìn)入函數(shù)時(shí)都初始化 a 2 i 32 c 5 cout OTHER n cout i i a a b b c c endl b a 對(duì)象的生存期 intmain staticinta 靜態(tài)局部變量 有全局壽命 局部可見 intb 10 b c為局部變量 具有動(dòng)態(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 運(yùn)行結(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) 動(dòng)態(tài)生存期對(duì)象的時(shí)鐘程序 includeusingnamespacestd classClock 時(shí)鐘類定義public 外部接口Clock voidsetTime intnewH intnewM intnewS 三個(gè)形參均具有函數(shù)原型作用域voidshowTime private 私有數(shù)據(jù)成員inthour minute second 對(duì)象的生存期 Clock Clock hour 0 minute 0 second 0 構(gòu)造函數(shù)voidClock setTime intnewH intnewM intnewS 三個(gè)形參均具有局部作用域hour newH minute newM second newS voidClock showTime cout hour minute second endl 20 ClockglobClock 聲明對(duì)象globClock 具有靜態(tài)生存期 文件作用域intmain 主函數(shù)cout Firsttimeoutput endl 引用具有文件作用域的對(duì)象 globClock showTime 對(duì)象的成員函數(shù)具有類作用域globClock setTime 8 30 30 ClockmyClock globClock 聲明具有塊作用域的對(duì)象myClockcout Secondtimeoutput endl myClock showTime 引用具有塊作用域的對(duì)象return0 21 程序的運(yùn)行結(jié)果為 Firsttimeoutput 0 0 0Secondtimeoutput 8 30 30 22 24 數(shù)據(jù)與函數(shù) 數(shù)據(jù)存儲(chǔ)在局部對(duì)象中 通過參數(shù)傳遞實(shí)現(xiàn)共享 函數(shù)間的參數(shù)傳遞 數(shù)據(jù)存儲(chǔ)在全局對(duì)象中 將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中 數(shù)據(jù)與函數(shù) 25 使用全局對(duì)象 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聲明該類的所有對(duì)象維護(hù)該成員的同一個(gè)拷貝必須在類外定義和初始化 用 來指明所屬的類 靜態(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 對(duì)x的引用是錯(cuò)誤的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ù)隱藏的機(jī)制 通過將一個(gè)模塊聲明為另一個(gè)模塊的友元 一個(gè)模塊能夠引用到另一個(gè)模塊中本是被隱藏的信息 可以使用友元函數(shù)和友元類 為了確保數(shù)據(jù)的完整性 及數(shù)據(jù)封裝與隱藏的原則 建議盡量不使用或少使用友元 友元 35 友元函數(shù) 友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾說明的非成員函數(shù) 在它的函數(shù)體中能夠通過對(duì)象名訪問private和protected成員作用 增加靈活性 使程序員可以在封裝和快速性方面做合理選擇 訪問對(duì)象中的成員必須通過對(duì)象名 友元 36 例5 6使用友元函數(shù)計(jì)算兩點(diǎn)距離 include includeclassPoint Point類聲明public 外部接口Point intx 0 inty 0 x x y y intgetX returnx intgetY returny friendfloatdist Point 友元 floatdist Point 36 38 友元類 若一個(gè)類為另一個(gè)類的友元 則此類的所有成員都能訪問對(duì)方類的私有成員 聲明語法 將友元類名在另一個(gè)類中使用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類的私有和保護(hù)數(shù)據(jù) 但A類的成員函數(shù)卻不能訪問B類的私有 保護(hù)數(shù)據(jù) 42 常類型 常類型的對(duì)象必須進(jìn)行初始化 而且不能被更新 常對(duì)象 必須進(jìn)行初始化 不能被更新 const類名對(duì)象名常引用 被引用的對(duì)象不能被更新 const類型說明符 引用名常數(shù)組 數(shù)組元素不能被更新 下一章介紹 類型說明符const數(shù)組名 大小 常指針 指向常量的指針 下一章介紹 共享數(shù)據(jù)的保護(hù) 43 常對(duì)象舉例 classA public A inti intj x i y j private intx y Aconsta 3 4 a是常對(duì)象 不能被更新 共享數(shù)據(jù)的保護(hù) 44 用const修飾的對(duì)象成員 常成員函數(shù)使用const關(guān)鍵字說明的函數(shù) 常成員函數(shù)不更新對(duì)象的數(shù)據(jù)成員 常成員函數(shù)說明格式 類型說明符函數(shù)名 參數(shù)表 const 這里 const是函數(shù)類型的一個(gè)組成部分 因此在實(shí)現(xiàn)部分也要帶const關(guān)鍵字 const關(guān)鍵字可以被用于參與對(duì)重載函數(shù)的區(qū)分通過常對(duì)象只能調(diào)用它的常成員函數(shù) 常數(shù)據(jù)成員使用const說明的數(shù)據(jù)成員 共享數(shù)據(jù)的保護(hù) 45 例5 7常成員函數(shù)舉例 includeusingnamespacestd classR public R intr1 intr2 r1 r1 r2 r2 voidprint voidprint const private intr1 r2 共享數(shù)據(jù)的保護(hù) 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ù)的保護(hù) constintA b 10 A A inti a i voidA print cout a b endl intmain 建立對(duì)象a和b 并以100和0作為初值 分別調(diào)用構(gòu)造函數(shù) 通過構(gòu)造函數(shù)的初始化列表給對(duì)象的常數(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ù)的保護(hù) 例5 9常引用作形參 floatdist constPoint 50 共享數(shù)據(jù)的保護(hù) 51 編譯預(yù)處理命令 include包含指令將一個(gè)源文件嵌入到當(dāng)前源文件中該點(diǎn)處 include按標(biāo)準(zhǔn)方式搜索 文件位于C 系統(tǒng)目錄的include子目錄下 include 文件名 首先在當(dāng)前目錄中搜索 若沒有 再按標(biāo)準(zhǔn)方式搜索 define宏定義指令定義符號(hào)常量 很多情況下已被const定義語句取代 定義帶參數(shù)宏 已被內(nèi)聯(lián)函數(shù)取代 undef刪除由 define定義的宏 使之不再起作用 52 條件編譯指令 if和 endif if常量表達(dá)式 當(dāng) 常量表達(dá)式 非零時(shí)編譯程序正文 endif 編譯預(yù)處理命令 53 條件編譯指令 else if常量表達(dá)式 當(dāng) 常量表達(dá)式 非零時(shí)編譯程序正文1 else 當(dāng) 常量表達(dá)式 為零時(shí)編譯程序正文2 endif 編譯預(yù)處理命令 54 條件編譯指令 elif if常量表達(dá)式1程序正文1 當(dāng) 常量表達(dá)式1 非零時(shí)編譯 elif常量表達(dá)式2程序正文2 當(dāng) 常量表達(dá)式2 非零時(shí)編譯 else程序正文3 其他情況下編譯 endif 編譯預(yù)處理命令 55 條件編譯指令 ifdef標(biāo)識(shí)符程序段1 else程序段2 endif如果 標(biāo)識(shí)符 經(jīng) defined定義過 且未經(jīng)undef刪除 則編譯程序段1 否則編譯程序段2 編譯預(yù)處理命令 56 條件編譯指令 ifndef標(biāo)識(shí)符程序段1 else程序段2 endif如果 標(biāo)識(shí)符 未被定義過 則編譯程序段1 否則編譯程序段2 編譯預(yù)處理命令 57 多文件結(jié)構(gòu) 例5 10 一個(gè)源程序可以劃分為多個(gè)源文件 類聲明文件 h文件 類實(shí)現(xiàn)文件 cpp文件 類的使用文件 main 所在的 cpp文件 利用工程來組合各個(gè)文件 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ì)量 凡是不會(huì)改變對(duì)象狀態(tài)的函數(shù) 都應(yīng)當(dāng)聲明為常成員函數(shù) 什么是改變對(duì)象狀態(tài) 改變對(duì)象狀態(tài) 不簡(jiǎn)單地等同于改變成員數(shù)據(jù)的值 只要一個(gè)成員函數(shù)執(zhí)行與否 不會(huì)影響以后接口函數(shù)的調(diào)用結(jié)果 都可以認(rèn)為它不會(huì)改變對(duì)象狀態(tài) 60 深度探索 常成員函數(shù)的聲明原則 classLine Line類的定義public 外部接口Line constPoint 61 深度探索 改變數(shù)據(jù)成員 但不改變對(duì)象狀態(tài) 常成員函數(shù)的聲明原則 在原則上 應(yīng)當(dāng)將getLen聲明為常成員函數(shù) 但由于修改了數(shù)據(jù)成員的值 語言規(guī)則不允許怎么辦 使用mutable關(guān)鍵字mutable關(guān)鍵字使得被修飾的成員對(duì)象無視 常對(duì)象的成員對(duì)象被視為常對(duì)象 這一語言原則Mutable須慎用 62 深度探索 修改后的程序代碼 63 深度探索 classLine Line類的定義public 外部接口Line constPoint 代碼的編譯 編譯 源文件 目標(biāo)文件源文件的函數(shù)代碼 目標(biāo)文件的代碼段源文件的靜態(tài)對(duì)象 目標(biāo)文件的數(shù)據(jù)段分為初始化的數(shù)據(jù)段和未初始化的數(shù)據(jù)段符號(hào)表 將靜態(tài)對(duì)象與函數(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 符號(hào)表 b o b cppintx 3 inty intfunc intv returnv x 深度探索 代碼的連接與執(zhí)行 連接將各段合并將符號(hào)表綜合根據(jù)重定位信息 確定代碼中用到的全局地址代碼的執(zhí)行操作系統(tǒng)首先將文件從磁盤讀入 初始化各段 一些靜態(tài)數(shù)據(jù)就在此時(shí)被初始化從引導(dǎo)代碼開始執(zhí)行 引導(dǎo)代碼啟動(dòng)main main返回后 引導(dǎo)代碼通知操作系統(tǒng)程序結(jié)束 67 深度探索 68 小結(jié)與復(fù)習(xí)建議 主要內(nèi)容作用域與可見性 對(duì)象的生存期 數(shù)據(jù)的共享與保護(hù) 友元 編譯預(yù)處理命令 多文件結(jié)構(gòu)和工程達(dá)到的目標(biāo)深入理解程序的結(jié)構(gòu) 模塊間的關(guān)系 數(shù)據(jù)共享 實(shí)驗(yàn)任務(wù)實(shí)驗(yàn)五- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 清華大學(xué)出版社 第四 課件 第五
鏈接地址:http://ioszen.com/p-8297203.html