組織程序結構的相關技術.ppt

上傳人:za****8 文檔編號:14508157 上傳時間:2020-07-22 格式:PPT 頁數:23 大?。?20.51KB
收藏 版權申訴 舉報 下載
組織程序結構的相關技術.ppt_第1頁
第1頁 / 共23頁
組織程序結構的相關技術.ppt_第2頁
第2頁 / 共23頁
組織程序結構的相關技術.ppt_第3頁
第3頁 / 共23頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《組織程序結構的相關技術.ppt》由會員分享,可在線閱讀,更多相關《組織程序結構的相關技術.ppt(23頁珍藏版)》請在裝配圖網上搜索。

1、第7章 組織程序結構的相關技術,C和C++中允許使用相當數量的以#開頭的預處理器指令,包括最常見的宏定義和#include指令。這些指令不是C++語句,在源程序被真正編譯之前,由一個預處理器將其替換成標準C++程序,故稱為預處理(器)指令或命令。,7.1 宏定義與條件編譯,7.1.1 宏定義,例如: #define _STRING_H //用于條件編譯目的是說明常量_STRING_H是否曾經被定義過; #define True 1 #define abs(x) ((x)0?(x):-(x)) 這種替換中不會發(fā)生任何計算行為。因為宏定義中沒有類型檢查,目前的第二、三種宏定義已基本被const

2、常量和inline函數取代。,7.1.2 條件編譯,條件編譯指令使預處理器能夠有選擇地取舍參加編譯的代碼,是為了提高程序的可移植性而設置的指令。 #ifdef 宏名 statements_1 #else statements_2 #endif 其中含義:如果已定義了宏,保留語句組statements_1部分參加編譯,否則語句組statements_2部分參加編譯(如果有#else部分)。 條件編譯指令會出現在每一個C或C++頭文件中。,7.2 頭文件包含,可以用一條指令代替大量的重復代碼,減輕了重復聲明的負擔。 例如,如果兩個程序文件中都使用了函數print或類A,那么,每個文件中都需要插入函

3、數的聲明和類的定義。 可以利用頭文件將函數聲明、類型定義等集中起來,再以頭文件包含指令插在程序開頭。,7.2.1 頭文件包含指令,頭文件包含指令有如下兩種格式: #include #include #include “文件名” #include d:userx.h 兩種格式區(qū)別: 第一種格式一般用于包含系統(tǒng)頭文件,主要在系統(tǒng)目錄中查找文件,速度較快, 第二種格式用于用戶自定義頭文件。主要在更多的目錄下查找,如程序文件所在的目錄等,因此會消耗更多的查找時間。 在預處理時,系統(tǒng)將用查找到的文件內容替換掉文件包含指令。,7.2.2 新舊庫頭文件,標準C++已經將這些內容重新在std名字空間中做了定義

4、。 C的頭文件:應在原來的C頭文件前加“c”, 如#include ; 舊版C++頭文件:文件名帶“.h”, 如#include ; 標準庫C++頭文件:文件名不帶“.h”, 如#include 。 事實上,#include 形式的文件包含雖然可用,但此時使用的C函數沒有包裝在std名字空間里。,7.2.3 類定義與實現的分離,類定義與實現部分通??偸欠蛛x的 類的定義構成.h文件,類的實現形成.cpp文件。 為了使用類的定義,.h文件必須對使用者公開,這樣,類的程序文件中采用文件包含指令包含頭文件,而.cpp文件一般編譯成機器代碼,使源程序代碼得到了保護。 與商業(yè)性相關的類定義及其實現構成了類

5、庫 主要的C++類庫包括微軟公司的MFC和Borland公司的OWL,分別集成在他們自己的C++產品中,為軟件開發(fā)工作提供支持。,7.2.4 頭文件中的內容,頭文件中的基本內容是“聲明”,可以包含如下的內容:,函數聲明,如“void print(int);”; 類型聲明,如“class A;”,說明A是一個類; 全局數據聲明,如“extern int m; extern double a;” 內聯函數定義,如“inline void fn() ... ”; 類模板定義,如“template class X ... ;”; 類型定義,如“class Y ... ;enum Z ... ;”; 全

6、局常量定義,如“const double pi = 3.14;”; 名字空間定義,如“namespace S ... ”。,7.2.5 一個頭文件示例,條件編譯的作用是使得第二次包含此頭文件時,所有內容不再參加編譯.,一個包含類定義的頭文件aclass.h可組織成如下形式: #ifndef _ACLASS_H//如果未定義宏_ACLASS_H,下面內容參加編譯 #define _ACLASS_H//定義宏 #include //函數或類定義中使用的頭文件 class A; void print(A #endif//條件編譯結束,在函數print和類A的實現文件aclass.cpp中,只要包含如

7、下命令,就可以實現對函數和類的聲明了: #include aclass.h,7.3 對象的構造與析構次序,#include using namespace std; class A int a; public: A(int av):a(av) cout << A constructor; a= << a << . << endl; ; A a1(1);//進入main函數之前初始化 int main() cout << Enter main function.n; A a2(2);//以下3個局部對象按先后順序初始化 static A a3(3); A a4(4); for(int k=0;

8、k<3; k++) A a5(5);//初始化三次 static A a6(6); //靜態(tài)對象只初始化一次 ,A constructor; a=1. Enter main function. A constructor; a=2. A constructor; a=3. A constructor; a=4. A constructor; a=5. A constructor; a=6. A constructor; a=5. A constructor; a=5.,局部的自動對象在程序流程離開所在塊時被拆除。 外部對象和靜態(tài)對象在程序運行結束時被拆除。 動態(tài)對象在用delete釋放或

9、程序運行結束時被拆除。 對象的拆除次序總是與構造次序相反的,即最先構造的對象最后拆除,包括并列、有繼承關系和一個對象是另一個對象的成員等所有情況。,,7.4 名字沖突、屏蔽與名字空間,在C++中有多種作用域。 在同一作用域內,數據名(常量和變量)和函數名屬于一類,彼此不能重復,類型名(使用class、struct、union和enum定義)屬于另一類,彼此也不能重復。 但不同種類的名字可以相同(如變量名和類型名可相同),不同作用域內的名字也可以相同。,7.4.1 名字沖突及對策,1 局部名對外部名的屏蔽作用,double A, x;//外部定義變量 class A ;//外部定義類型 int

10、main( ) class A ;//內部定義類型 int x;//main函數體局部定義變量 A a;//局部定義的A屏蔽外部的A for(int k=0; k<10; k++) double x = 1;//塊內定義 cout << x++;//塊內的x屏蔽main及以外的x cout << x;//main的x屏蔽外部x ,,2 數據名和函數名沖突 在內部數據或函數名屏蔽了外部類型名時,應使用類型名的全名(帶class、struct、union或enum關鍵字)來表示類型名; 在局部定義的類型名屏蔽了外部數據或函數名時,以域解析符“::”進行區(qū)分。,class X ;//外部類型

11、class Y ;//外部類型 int Y = 1;//外部變量 void fn(int X)//形參變量X class X x1; //形參變量X屏蔽了類型名X,采用類型全名 X++; //形參變量X class Y y1;//必須用全名與外部變量Y相區(qū)別 ::Y = 2; //用域解析符::引用外部變量Y ,7.4.2 定義和使用名字空間,1 名字空間的定義 同一種類的名字在其中必須唯一的作用域稱為名字空間。 此部分內容要求學生自學。,,2 使用名字空間中的定義 此部分內容要求學生自學。,7.5 C++與C的混合編程,對用于C++的C語言代碼要做適當處理,方法是將C語言的代碼進行下述形

12、式的修飾:,extern C //C語言的代碼(外部函數) 修飾中的extern說明被修飾的C語言代碼中的名字應該是外部的,而”C”則說明這些名字按C語言而非C++語言的方式處理。,7.5.1 extern的作用,extern是C/C++語言中表明函數和全局變量作用域(可見性)的關鍵字,作用是告訴編譯器,它所聲明的函數或變量是全局的(或稱外部的),可以在本文件(模塊)或其它文件(模塊)中使用。,,1 用extern聲明外部變量 extern int a; 編譯器對這樣聲明的變量a并不分配內存空間,而是在各模塊中查找匹配的定義(int a)。 如果在其它地方定義了外部變量a,上述語句是聲明語句(

13、不能初始化);如果沒定義外部變量a,上述語句就是變量a的定義語句(可以包含初始化部分)。,,2 用extern聲明外部函數 extern int fn(int); 與沒有extern修飾的效果相同,表示函數fn可以在任何模塊中引用。 與extern相對的是static關鍵字,如果一個外部變量或函數用static修飾,表明此變量或函數僅可以在定義它的模塊中使用,自然不可以被extern “C”修飾。,,3 外部引用方法 在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變量以關鍵字extern 聲明。,B.cpp的實現: int a = 10; int fn(int x) cout << x

14、; B.h的組織: extern int a;//聲明 extern int fn(int x); 引用a和fn的A.cpp可如下實現: #include b.h int main() fn(a); ,在編譯時,雖然模塊A中找不到fn和a,但系統(tǒng)不會報錯,可以在連接階段從模塊B編譯生成的目標代碼中找到它們。,7.5.2 用extern “C”修飾C的代碼,為了使一個C語言模塊B.c能夠在C和C++環(huán)境下使用,應該按如下方式組織它的頭文件B.h:,#ifndef __B_H #define __B_H void func(int x, double y); #endif,#ifndef __B_H #define __B_H extern C void func(int x, double y); #endif,#ifndef __B_H //防止重復定義 #define __B_H #ifdef __cplusplus//檢測編譯模式 extern C #endif void func(int x, double y);//函數聲明部分 #ifdef __cplusplus//檢測編譯模式 #endif #endif,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯系電話:18123376007

備案號:ICP2024067431-1 川公網安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!