獨(dú)立編譯與命名空間_第1頁(yè)
獨(dú)立編譯與命名空間_第2頁(yè)
獨(dú)立編譯與命名空間_第3頁(yè)
獨(dú)立編譯與命名空間_第4頁(yè)
獨(dú)立編譯與命名空間_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、主要內(nèi)容:獨(dú)立編譯命名空間預(yù)編譯指令54獨(dú)立編譯 C+程序結(jié)構(gòu):將一個(gè)程序分解為不同的部分,這些部分保 存在獨(dú)立葩文件中,分別進(jìn)行獨(dú)立編譯,并且在 程序運(yùn)行之前,連接到一起。類的結(jié)構(gòu):一個(gè)類可以用兩個(gè)文件來(lái)定義,分別是h 和egg文件,將這個(gè)類的工作規(guī)范說(shuō)明與類的實(shí) 現(xiàn)細(xì)哺區(qū)分開來(lái)。序。這律做,就能建立一個(gè)類庫(kù),以便多個(gè)程序果藉勰黠鶴類只需編譯次即可在多 一個(gè)類是程序員自定義的一種數(shù)據(jù)類型,它不同于C+語(yǔ)言內(nèi)部的數(shù)據(jù)類型(如int、char、float、 double bool等)。類是一種抽象數(shù)據(jù)類型,分為類的定義和類的實(shí) 現(xiàn),類的定義也可以稱為類的接口。為了定義一個(gè)抽象數(shù)據(jù)類型,需要分離類

2、的使用 規(guī)范(即接口,這是給類的使用者看的)和類的 實(shí)現(xiàn)細(xì)節(jié)。這種分離應(yīng)該是完整的,其目的是在 更改了類的實(shí)現(xiàn)之后,完全不需要更改使用類的 任何程序。為了保證類定義和類實(shí)現(xiàn)的完整分離,應(yīng)該遵循以 下三個(gè)規(guī)則:1.使所有類的數(shù)據(jù)成員都成為類的私有成員。如果 一個(gè)類需要派生出新類,可將這個(gè)類的數(shù)據(jù)成員定義為保護(hù)類型。2. 使附加在類之上的操作,都成為類的一個(gè)公有成 員函數(shù),或者一個(gè)友元函數(shù),或者一個(gè)普通函數(shù), 或者一個(gè)重載的操作符。將類的定義與這些函數(shù) 的聲明組合右一起,祿為棗的接口。一個(gè)好的蕭 程習(xí)慣是,為類的函數(shù)或者操作符配套相關(guān)注釋, 在注釋中完整說(shuō)明如何使用這些函數(shù)或者操作符。3. 確保使

3、用這個(gè)類的程序員不能訪問(wèn)該類的函數(shù)實(shí)現(xiàn),也就是保證類函數(shù)的調(diào)用程序不能修改類函數(shù)的實(shí)現(xiàn)細(xì)節(jié)。【例5-1】一個(gè)獨(dú)立編譯的類CTimelnfo的UML圖CTimelnfo-hour:int-minute : int+ CTimeInfo()+CTimeInfo(:int,:int)+advance(:int) : void+advance(:int, :int) : voidfriend+is_equal (:CTimelnfo&, :CTimelnfo&) : bool friend+operator (:istream&, :CTimelnfo& ): istream& friend+oper

4、ator (:ostream&, :CTimelnfo& ): ostream&【例5-1】一個(gè)獨(dú)立編譯的類CTimelnfo,用24小時(shí) 制表示一天中的時(shí)間,比如8:30或者13: 45o程序 實(shí)現(xiàn)時(shí)間的輸入輸出和時(shí)間調(diào)后等功能。#i ncludevio streamusing namespace std;class CTimelnfopublic:CTimelnfo();將時(shí)間值初始化為o:oo,表示午夜CTimelnfo (int the_hour,int the_minute);將時(shí)間值初始化為the_hour和the_minute條件:o = the_hour = 23, 而且o =

5、 the_minute (n) ? (m): (n)其中,,n)是宏MAX的參數(shù)表。如果程序中出現(xiàn) 下列語(yǔ)句:x二MAX (5, 6);則預(yù)處理后,程序變?yōu)?x= (5)(6)?:;/結(jié)果為6很顯然,帶參數(shù)的宏定義相當(dāng)于一個(gè)函數(shù)的功能, 但是,卻比函數(shù)簡(jiǎn)潔。2.文件包含命令include:文件包含是將另一個(gè)源文件中的內(nèi)容合并到 當(dāng)前的源文件中。文件包含可以減少程序員的重 復(fù)勞動(dòng)。C+提供#include命令實(shí)現(xiàn)文件包含操作, 它有兩種格式:#include文件名ttinclude “文件名”第一種方式稱為標(biāo)準(zhǔn)方式,第二種方式稱為用戶方 式。使用include預(yù)編譯命令時(shí),需要注意三點(diǎn):(1)

6、一條include命令只能包含一個(gè)文件,如果想包 含多個(gè)文件,需要用多條include命令,例如:#include#inculde(2)在ANSI/ISO C+中,include后面的文件名不 再有h擴(kuò)展名,取而代之的是直接使用文件名。為 了能在C+中使用C語(yǔ)言中的庫(kù)函數(shù),又能使用C+ 新的頭文件包含格式,ANSI/ISO將有些C語(yǔ)言中的頭文件去除h,并在頭文件前面加上“c”變?yōu)镃+的頭文件,實(shí)際上它們的內(nèi)容相同。(3) 在C+中,頭文件是不允許相互包含的。所謂相 互包含,是指ah文件包含了bh,而b. h文件又包 含了a.h文件。3.條件編譯命令:一 一條件編譯命令經(jīng)常出現(xiàn)在比較大的程序中。

7、 使用條件編譯指令,可以限定程序中的某些內(nèi)容 要在滿足一定條件的情況下,才參與編譯。因此,利用條件編譯可以使同一個(gè)源程序在 不同的編譯條件下產(chǎn)生不同的目標(biāo)代碼。常用的 條件編譯語(yǔ)句有下列5種形式:形式一:#辻常量表達(dá)式程序段當(dāng)常量表達(dá)式為真時(shí),編譯本程序段ttendif形式二:#if常量表達(dá)式程序段1當(dāng)常量表達(dá)式為真時(shí),編譯本程序段#else程序段2當(dāng)常量表達(dá)式為假時(shí),編譯本程序段#endif爐三:亠籬常量表達(dá)式1f程序段1/當(dāng)常量表達(dá)式1為真時(shí),編譯本程序段#el遷常量表達(dá)式2程序段2 /當(dāng)常量表達(dá)式1為假、常量表達(dá)式2為真時(shí),編譯本程序段#el辻常量表達(dá)式n程序段n /當(dāng)常量表達(dá)式1、n-

8、1均為假、常量表達(dá)式n為真時(shí),編譯本程序段#else程序段n+1其他情況下編譯本程序段ttpndi f形式四:標(biāo)識(shí)符ttifdef程序段1#else程序段2#endif形式五:#ifndef 標(biāo)識(shí)符程序段1如果標(biāo)識(shí)符沒(méi)有定義過(guò),則編譯程序段1 #else/否則,編譯程序段2程序段2ttendif5.2弗名空間_個(gè)軟件往往由多個(gè)模塊組合而成,其 中包括由不同的程序員開發(fā)的組件以及類庫(kù) 提供的組件,這樣不同的模塊間在對(duì)標(biāo)識(shí)符 命名時(shí)就有可能發(fā)生命名沖突,或者說(shuō),在 不同的模塊中使用相同的名字表示不同的事物,這樣當(dāng)然會(huì)引起程序出錯(cuò)。命名空間(namespace)的概念就是為了解決這個(gè)問(wèn)題而提出來(lái)的。

9、using預(yù)細(xì)譯描令using namespace std; std表示標(biāo)準(zhǔn)(standard)的意思。在std命 名空間中,包含了所用的標(biāo)準(zhǔn)庫(kù)文件中定義 的所有名稱,比如iostream、cstdlibo如 果將M下i nc 1 ude語(yǔ)句放在一個(gè)文件的開頭:#include就會(huì)將所有名稱定義(比如cin和cout)放 到std命名空間。C+的任何代碼都位于某個(gè)命名空間。如果 不明確表示將代碼放在哪個(gè)特定的命名空間, 那么代碼就默認(rèn)位于全局命名空間。全局命名空間不需要使用using預(yù)編譯指令, 因?yàn)樗悄J(rèn)的命名空間。默認(rèn)情況下,有一個(gè)隱式的自動(dòng)化using預(yù) 編譯指令指出你需要使用全局命名

10、空間。在同一個(gè)程序中,可以同時(shí)使用多個(gè)命名空間。例 如,假定nsl和ns2是兩個(gè)不同的命名空間,并且 假定my_function是一個(gè)無(wú)參數(shù)的void函數(shù),它在 兩個(gè)命雖空間中以不同的方式進(jìn)行了定義。 using namespace nsl; my_functi on() ;using namespace ns2;my_function() ;上述代碼是合法的。第一個(gè)對(duì)my_function的調(diào)用使用在命名空間nsl中 給出的my_function定義,第二個(gè)對(duì)my function 的調(diào)用則社用在、命名空間ns2中給出的 my_func t i on 定義。如果要將代碼放入到一個(gè)命名空間中,

11、需要釆用下 面的語(yǔ)法形式來(lái)定義一個(gè)命名空間分組:namespace Name_Space_Nameprogram code將上面的命名空間分組放入到自己的代碼中,就相當(dāng)于將program code中定義的類、變量、函數(shù)等 名稱放到命名空間Name_Space_Name中。為了使用 這些名稱,需要使用相血的using預(yù)編譯指令:using namespace Name_Space_Name;例如,以下代碼將一個(gè)函數(shù)聲明放到命名空間lucyl 中:namespace lucyl void greeting();可以將函數(shù)greeting的定義也放在命名空間lucyl 中,這是通過(guò)下面的命名空間分組

12、來(lái)完成的:namespace lucyl void greeting()cout Hello from namespace lucyl. ” endl;【例5-2】創(chuàng)建命名空間演示。 /nsdemo. cpp#includeusing namespace std;namespace lucyl void greeting();namespace lucy2 void greeting();void big_greeting();int main() using namespace lucyl:這個(gè)語(yǔ)句塊中的名稱使用了命名空間lucyl. std 和全局命名空間的定義greeting() ; u

13、sing namespace lucy2:這個(gè)語(yǔ)句塊中的名稱使用了命名空間lucy2 std和全局命名空間的定義greeting() ;big_greeting();/使用了命名空間std和全局命名空間中的定義return 0;naaspace void greeting() cout Hello from namespace lucyl. endl;namespace lucy2 void greeting() cout Greeting from namespace lucy2. endl; void big_greeting() cout A big global hello!z, endl;程序執(zhí)行結(jié)果:Hello from namespace lucyL Greeting from namespace lucy2. A big global hello!為無(wú)名命名空間寫一個(gè)命名空間分組時(shí),采取與其 他任何命名空間一樣的方式,只是不給出具體名 稱,如下所示:namespacevoid sample_function();/無(wú)名命名空間通常將類的定義和類成員函數(shù)的實(shí)現(xiàn)分別放在獨(dú)立的、同名的h和.cpp文件。獨(dú)立地對(duì)這個(gè)類進(jìn) 行編譯,可以在任意數(shù)量的程序中使用這個(gè)類,當(dāng)類的內(nèi)容需要修改時(shí),只需重新編譯這個(gè)類所 在的文件,而無(wú)需修改使用它的眾多應(yīng)用程序,起到提高編譯效率的作用

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論