版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第五章 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è)有下列原型聲明: double Area(double radius);,radius 的作用域僅在于此,不能用于程序正文其他地方,因而可有可無。,作用域與可見性,4,塊作用域,在塊中聲明的標識符,其作用域自聲明處起,限于塊中,例如: void fun(int a) int b(a); cinb; if (b0) int c; . ,作
2、用域與可見性,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)聲明在先
3、,引用在后。 如果某個標識符在外層中聲明,且在內(nèi)層中沒有同一標識符的聲明,則該標識符在內(nèi)層可見。 對于兩個嵌套的作用域,如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內(nèi)層不可見。,作用域與可見性,9,同一作用域中的同名標識符,在同一作用域內(nèi)的對象名、函數(shù)名、枚舉常量名會隱藏同名的類名或枚舉類型名。 重載的函數(shù)可以有相同的函數(shù)名。,作用域與可見性,10,#include int i; /文件作用域 int main() i=5; int i; /塊作用域 i=7; couti=iendl; /輸出7 couti=i; /輸出5 return 0; ,作用域與可見性,例
4、 5.1,11,對象的生存期,對象從產(chǎn)生到結(jié)束的這段時間就是它的生存期。在對象生存期內(nèi),對象將保持它的值,直到被更新為止。,12,靜態(tài)生存期,這種生存期與程序的運行期相同。 在文件作用域中聲明的對象具有這種生存期。 在函數(shù)內(nèi)部聲明靜態(tài)生存期對象,要冠以關(guān)鍵字static 。,對象的生存期,13,#include int i=5; /文件作用域 int main() couti=iendl; return 0; i具有靜態(tài)生存期,對象的生存期,例,14,動態(tài)生存期,塊作用域中聲明的,沒有用static修是的對象是動態(tài)生存期的對象(習(xí)慣稱局部生存期對象)。 開始于程序執(zhí)行到聲明點時,結(jié)束于命名該標
5、識符的作用域結(jié)束處。,對象的生存期,15,#include void fun(); int main() fun(); fun(); void fun() static int a=1; int i=5; a+; i+; couti=i,a=aendl; ,運行結(jié)果: i=6, a=2 i=6, a=3 i是動態(tài)生存期 a是靜態(tài)生存期,對象的生存期,例,16,例5-2 變量的生存期與可見性,#include int i=1; / i 為全局變量,具有靜態(tài)生存期。 int main() static int a;/ 靜態(tài)局部變量,有全局壽命,局部可見。 int b=-10; / b, c為局部變
6、量,具有動態(tài)生存期。 int c=0; void other(void); cout-MAIN-n; cout i: i a: a b: b c: cendl; c=c+8; other(); cout-MAIN-n; cout i: i a: a b: b c: cendl; i=i+10; other(); ,對象的生存期,void other(void) static int a=2; static int b; / a,b為靜態(tài)局部變量,具有全局壽命,局部可見。 /只第一次進入函數(shù)時被初始化。 int c=10; / C為局部變量,具有動態(tài)生存期, /每次進入函數(shù)時都初始化。 a=a+
7、2; i=i+32; c=c+5; cout-OTHER-n; cout i: i a: a b: b c: cendl; b=a; ,17,運行結(jié)果: -MAIN- i: 1 a: 0 b: -10 c: 0 -OTHER- i: 33 a: 4 b: 0 c: 15 -MAIN- i: 33 a: 0 b: -10 c: 8 -OTHER- i: 75 a: 6 b: 4 c: 15,18,19,例5-3具有靜態(tài)、動態(tài)生存期對象的時鐘程序,#include class Clock/時鐘類聲明 public:/外部接口 Clock(); void SetTime(int NewH, int
8、NewM, int NewS); /三個形參均具有函數(shù)原型作用域 void ShowTime(); Clock() private:/私有數(shù)據(jù)成員 int Hour,Minute,Second; ;,對象的生存期,/時鐘類成員函數(shù)實現(xiàn) Clock:Clock() /構(gòu)造函數(shù) Hour=0; Minute=0; Second=0; void Clock:SetTime(int NewH,int NewM,int NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock:ShowTime() coutHour:Minute:Secondendl;
9、,20,Clock globClock;/聲明對象globClock, /具有靜態(tài)生存期,文件作用域 int main()/主函數(shù) coutFirst time output:endl; /引用具有文件作用域的對象: globClock.ShowTime();/對象的成員函數(shù)具有類作用域 globClock.SetTime(8,30,30); Clock myClock(globClock); /聲明具有塊作用域的對象myClock coutSecond time output:endl; myClock.ShowTime();/引用具有塊作用域的對象 ,21,程序的運行結(jié)果為: First
10、time output: 0:0:0 Second time output: 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,使用全局對象,#include int global; void f() global=5; void g() coutglobalendl; int main() f(); g(); /輸出“5” return 0; ,數(shù)據(jù)與函數(shù),25,將函數(shù)與數(shù)據(jù)封裝,#include class Application public: void f(
11、);void g(); private: int global; ; void Application:f() global=5; void Application:g() coutglobalendl;,int main() Application MyApp; MyApp.f(); MyApp.g(); return 0; ,數(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ù)
12、成員或靜態(tài)成員函數(shù)。,靜態(tài)成員,27,例5-4 具有靜態(tài)數(shù)據(jù)成員的 Point類,#include using namespace std; class Point public: Point(int xx=0, int yy=0) X=xx; Y=yy; countP+; Point(Point ,靜態(tài)成員,Point:Point(Point ,28,29,靜態(tài)成員函數(shù)舉例,#include class Application public: static void f(); static void g(); private: static int global; ; int Applica
13、tion:global=0;,void Application:f() global=5; void Application:g() coutglobalendl; int main() Application:f(); Application:g(); return 0; ,靜態(tài)成員,30,靜態(tài)成員函數(shù)舉例,class A public: static void f(A a); private: int x; ; void A:f(A a) coutx; /對x的引用是錯誤的 couta.x; /正確 ,靜態(tài)成員,31,具有靜態(tài)數(shù)據(jù)、函數(shù)成員的 Point類,#include class P
14、oint/Point類聲明 public:/外部接口 Point(int xx=0,int yy=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ù)體中
15、能夠通過對象名訪問 private 和 protected成員 作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。 訪問對象中的成員必須通過對象名。,友 元,35,例5-6 使用友元函數(shù)計算兩點距離,#include #include class Point/Point類聲明 public:/外部接口 Point(int xx=0, int yy=0) X=xx;Y=yy; int GetX() return X; int GetY() return Y; friend float Distance(Point ,友 元,double Distance( Point ,36,37,友
16、元類,若一個類為另一個類的友元,則此類的所有成員都能訪問對方類的私有成員。 聲明語法:將友元類名在另一個類中使用friend修飾說明。,友 元,38,友元類舉例,class A friend class B; public: void Display() coutxendl; private: int x; class B public: void Set(int i); void Display(); private: A a; ;,友 元,void B:Set(int i) a.x=i; void B:Display() a.Display(); ,39,40,友元關(guān)系是單向的,如果聲明B
17、類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有、保護數(shù)據(jù)。,41,常類型,常類型的對象必須進行初始化,而且不能被更新。 常引用:被引用的對象不能被更新。 const 類型說明符 y=j; . private: int x,y; ; A const a(3,4); /a是常對象,不能被更新,共享數(shù)據(jù)的保護,44,用const修飾的對象成員,常成員函數(shù) 使用const關(guān)鍵字說明的函數(shù)。 常成員函數(shù)不更新對象的數(shù)據(jù)成員。 常成員函數(shù)說明格式:類型說明符 函數(shù)名(參數(shù)表)const;這里,const是函數(shù)類型的一個組成部分,因此在實現(xiàn)部分也要帶con
18、st關(guān)鍵字。 const關(guān)鍵字可以被用于參與對重載函數(shù)的區(qū)分 通過常對象只能調(diào)用它的常成員函數(shù)。 常數(shù)據(jù)成員 使用const說明的數(shù)據(jù)成員。,共享數(shù)據(jù)的保護,45,例5-8 常成員函數(shù)舉例,#include class R public: R(int r1, int r2)R1=r1;R2=r2; void print(); void print() const; private: int R1,R2; ;,共享數(shù)據(jù)的保護,void R:print() coutR1:R2endl; void R:print() const coutR1;R2endl; int main() R a(5,4);
19、 a.print(); /調(diào)用void print() const R b(20,52); b.print(); /調(diào)用void print() const ,46,47,例5-9 常數(shù)據(jù)成員舉例,#include class A public: A(int i); void print(); const int,共享數(shù)據(jù)的保護,const int A:b=10; A:A(int i):a(i),r(a) /? void A:print() couta:b:rendl; int main() /*建立對象a和b,并以100和0作為初值,分別調(diào)用構(gòu)造函數(shù),通過構(gòu)造函數(shù)的初始化列表給對象的常數(shù)據(jù)成
20、員賦初值*/ A a1(100),a2(0); a1.print(); a2.print(); ,48,49,編譯預(yù)處理命令,#include 包含指令 將一個源文件嵌入到當前源文件中該點處。 #include 按標準方式搜索,文件位于C+系統(tǒng)目錄的include子目錄下 #include文件名 首先在當前目錄中搜索,若沒有,再按標準方式搜索。 #define 宏定義指令 定義符號常量,很多情況下已被const定義語句取代。 定義帶參數(shù)宏,已被內(nèi)聯(lián)函數(shù)取代。 #undef 刪除由#define定義的宏,使之不再起作用。,50,條件編譯指令 #if 和 #endif,#if 常量表達式 /當“ 常量表達式”非零時編譯 程序正文 #endif .,編譯預(yù)處理命令,51,條件編譯指令#else,#if 常量表達式 /當“ 常量表達式”非零時編譯 程序正文1 #else /當“ 常量表達式”為零時編譯 程序正文2 #endif,編譯預(yù)處理命令,52,條件編譯指令 #elif,#if 常量表達式1 程序正文1 /當“ 常量表達
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年店倉一體履約體系項目公司成立分析報告
- 2026年智能安全錘項目可行性研究報告
- 園林古建筑防火措施方案
- 民辦高校教師人工智能素養(yǎng)的提升機制與培訓(xùn)體系
- 2026年寶石花(天津)國際醫(yī)療健康有限公司招聘備考題庫及參考答案詳解
- 2026年三亞鐵路投資建設(shè)有限公司招聘備考題庫及一套參考答案詳解
- 2026年安徽皖信人力資源管理有限公司招聘某銀行項目經(jīng)理崗位備考題庫及一套參考答案詳解
- 2026年哈爾濱市平房區(qū)平房鎮(zhèn)衛(wèi)生院招聘醫(yī)療技術(shù)工作人員的備考題庫含答案詳解
- 2026年樂東黎族自治縣人民醫(yī)院醫(yī)共體(萬沖分院)公開招聘編外人員備考題庫及一套完整答案詳解
- 2026年中國中金財富證券有限公司海南分公司招聘備考題庫完整參考答案詳解
- DB31∕T 1450-2023 旅游碼頭服務(wù)基本要求
- 2024-2025學(xué)年人教版數(shù)學(xué)七年級上學(xué)期期末考試測試卷
- 南寧陳教練2026年版考試大綱廣西專升本與職教高考(財經(jīng)商貿(mào)大類)考試大綱對比分析及備考攻略
- 滅菌物品裝載課件
- 2025至2030中國電力設(shè)備檢測行業(yè)項目調(diào)研及市場前景預(yù)測評估報告
- 2025上半年軟考系統(tǒng)架構(gòu)設(shè)計師考試真題及答案
- 尾礦綜合利用技術(shù)在生態(tài)環(huán)境保護中的應(yīng)用與經(jīng)濟效益分析報告
- 政務(wù)信息化統(tǒng)一建設(shè)項目監(jiān)理服務(wù)方案投標文件(技術(shù)方案)
- 2025年蘇州市事業(yè)單位招聘考試教師招聘體育學(xué)科專業(yè)知識試卷
- 加油站投訴處理培訓(xùn)課件
- 畢業(yè)設(shè)計(論文)-基于PLC的醫(yī)院病房呼叫系統(tǒng)設(shè)計
評論
0/150
提交評論