類(lèi)的深入剖析第i部分_第1頁(yè)
已閱讀1頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、類(lèi)的深入剖析(第I部分),,,預(yù)處理命令Time類(lèi)實(shí)例研究類(lèi)的作用域析構(gòu)函數(shù)如何調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)默認(rèn)的逐個(gè)成員賦值,預(yù)處理命令,所謂編譯預(yù)處理就是編譯器在對(duì)源程序進(jìn)行正式編譯前,根據(jù)預(yù)處理指令先做一些特殊的處理工作,然后將源程序與預(yù)處理的結(jié)果一起進(jìn)行編譯。C++ 語(yǔ)言的預(yù)處理主要包括 3 方面的操作:嵌入指令、宏定義和條件編譯指令。應(yīng)當(dāng)說(shuō)明的是,編譯預(yù)處理指令不屬于 C++ 語(yǔ)言的語(yǔ)法范疇。因此,預(yù)處理指令具有其

2、特有語(yǔ)法。,種類(lèi):宏定義 #define文件包含 #include條件編譯 #if--#else--#endif等語(yǔ)法格式:“#”開(kāi)頭占單獨(dú)書(shū)寫(xiě)行語(yǔ)句尾不加分號(hào),預(yù)處理命令,不帶參數(shù)宏定義一般形式: #define 標(biāo)識(shí)符 字符串功能: 用指定標(biāo)識(shí)符代替字符串注:宏定義的替換正文可以為空:例如:#define TIME_H這里,將標(biāo)識(shí)符 TI

3、ME_H 作為一個(gè)標(biāo)志,以便于條件編譯預(yù)處理指令進(jìn)行測(cè)試。,宏定義,宏定義,定義位置:任意(通常放在文件開(kāi)頭,函數(shù)之外)作用域:從定義命令到文件結(jié)束#undef 可終止宏名作用域 格式: #undef 標(biāo)識(shí)符宏定義可嵌套,不能遞歸,例 #define MAX MAX+10 (?),#define A 3#define B A+A #d

4、efine C B*B,例:下列程序宏替換。,#include using namespace std;#define N 2#define M N+1# define NUM (M+3)*M/2 void main() { int i; for (i=0; i<=NUM; i++); cout&l

5、t;<i<<endl;#undef NUM #define NUM M+2*Nfor (i=0; i<=NUM; i++); cout<<i; },一般形式: #define 宏名(參數(shù)表) 宏體,例 #define S (r) PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r) PI*r*r”

6、,宏展開(kāi):形參用實(shí)參換,其它字符保留,例 #define S(a,b) a*b ……….. area=S(3,2);宏展開(kāi): area=3*2;,不能加空格,宏定義-帶參數(shù)宏定義,宏定義-帶參數(shù)宏定義,例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展開(kāi):z=x+y*x+y;一般寫(xiě)

7、成: #define POWER(x) ((x)*(x))宏展開(kāi): z=((x+y)*(x+y));,宏體及各形參外一般應(yīng)加括號(hào)(),宏定義-帶參數(shù)宏定義,例1: #include using namespace std;#define S(x,y,z) x*y+z void main() { int a=1, b=1,c=2; cout<

8、;<S(a+b,b+c,c+a); },宏定義-帶參數(shù)宏定義,例: #include using namespace std;#define N 10#define s(x) x*x#define f(x) (x*x) void main() { int a, b; a=100/s(N); b=100/f(N);

9、 cout<<a<<" "<<b; },#define MAX(x,y) (x)>(y)?(x):(y) …….main(){ int a,b,c,d,t; ……. t=MAX(a+b,c+d); ……}宏展開(kāi):t=(a+b)>(c+d)?(a+b):(c+d);,int max(int x,in

10、t y){ return(x>y?x:y);}main(){ int a,b,c,d,t; ……. t=max(a+b,c+d); ………},,用帶參的宏定義和函數(shù)實(shí)現(xiàn)同樣的功能,帶參的宏與函數(shù)區(qū)別,處理時(shí)間:宏是在編譯前,函數(shù)是在運(yùn)行時(shí)。 程序執(zhí)行速度:宏(不占運(yùn)行時(shí)間)比函數(shù)快。 程序代碼長(zhǎng)度:使用宏的源程序代碼會(huì)變長(zhǎng),而函數(shù)調(diào)用不會(huì)使源程序變長(zhǎng)。 參數(shù):函數(shù)中

11、的形參與實(shí)參都要定義類(lèi)型,宏的參數(shù)沒(méi)有類(lèi)型函數(shù)調(diào)用時(shí)先求實(shí)參表達(dá)式的值,再將值傳給形參。帶參數(shù)的宏只是字符替換。宏替換并不分配存儲(chǔ)單元。,功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式: #include “文件名” 或 #include ,處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯。, 直接按系統(tǒng)指定目錄搜索“

12、” 先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄,可指定路徑,2. 文件包含,條件編譯:按條件對(duì)C++程序的一部分進(jìn)行編譯,其它部分不編譯。條件編譯的目的:是使源代碼能更迅速、更容易地進(jìn)行修改,并使目標(biāo)代碼縮短。這樣,當(dāng)程序在不同系統(tǒng)上編譯、在同一系統(tǒng)不同編譯器上編譯或進(jìn)行不同目的的編譯時(shí),減少對(duì)程序語(yǔ)句的修改。,條件編譯,形式1:#ifdef 標(biāo)識(shí)符 程序段1#else 程序段2#endif意義:若該標(biāo)識(shí)符已被

13、#define命令定義,則編譯程序段1,否則編譯程序段2,形式2:#ifndef 標(biāo)識(shí)符 程序段1#else 程序段2#endif意義:若該標(biāo)識(shí)符沒(méi)有被#define命令定義,則編譯程序段1,否則編譯程序段2,形式1:#if 表達(dá)式 程序段1#else 程序段2#endif意義:若該表達(dá)式之值非0 (為真) ,則編譯程序段1,否則編譯程序段2,注:#else 程序段2 這部分可以沒(méi)有。其中

14、#ifdef等價(jià)于#if defined#ifndef等價(jià)于#if !defined,條件編譯,有一個(gè)數(shù)據(jù)類(lèi)型,在Windows平臺(tái)中,應(yīng)該使用long類(lèi)型表示,而在其他平臺(tái)應(yīng)該使用 float表示,這樣往往需要對(duì)源程序作必要的修改,這就降低了程序的通用性??梢杂靡韵碌臈l件編譯: #ifdef WINDOWS #define MYTYPE long #else #define MYTYPE fl

15、oat #endif 如果在Windows上編譯程序,則可以在程序的開(kāi)始加上 #define WINDOWS,預(yù)處理器封套,在頭文件中使用“預(yù)處理器封套”,從而防止將頭文件中的代碼多次包含到同一個(gè)源代碼文件中。由于一個(gè)類(lèi)只能被定義一次,所以使用這樣的預(yù)處理器指令避免重復(fù)定義的錯(cuò)誤。#ifndef頭文件名#define頭文件名…………// 頭文件中的內(nèi)容#endif,在頭文件預(yù)處理命令#ifn

16、def和#define中,使用大寫(xiě)字母,并用下劃線(xiàn)代替圓點(diǎn)。例如:tdata.h寫(xiě)成 TDATA_Htime.h寫(xiě)成TIME_H,類(lèi)的作用域,類(lèi)的作用域簡(jiǎn)稱(chēng)類(lèi)域,類(lèi)域的范圍是指在類(lèi)所定義的類(lèi)體中,該類(lèi)的成員局部于該類(lèi)所屬的類(lèi)域。一個(gè)類(lèi)的任何成員都能訪(fǎng)問(wèn)同一類(lèi)的任一其他成員。對(duì)類(lèi)作用域外的一個(gè)類(lèi)的數(shù)據(jù)成員和成員函數(shù)的訪(fǎng)問(wèn)受程序員編寫(xiě)程序的控制。當(dāng)把成員定義為私有和保護(hù)時(shí),外界訪(fǎng)問(wèn)被限制。類(lèi)域可以被包含在文件域中,可見(jiàn)類(lèi)域小于文件域;

17、而類(lèi)域中又可包含函數(shù)域,可見(jiàn)類(lèi)域又大于函數(shù)域。類(lèi)域介于文件域和函數(shù)域之間。,不同存儲(chǔ)類(lèi)的對(duì)象具有不同的生命期。 對(duì)象的生存期是指對(duì)象從創(chuàng)建開(kāi)始到被釋放為止的存在時(shí)間,即該對(duì)象的壽命。 按生命期的不同,對(duì)象可分為如下三種(與介紹的變量劃分情況相似)。 1、局部對(duì)象:定義在一個(gè)函數(shù)體內(nèi)或程序塊內(nèi),作用域和生命周期都是局部的; 2、全局對(duì)象:定義在某個(gè)文件中,作用域?yàn)榘撐募恼麄€(gè)程序

18、,生命期是全局的; 3、靜態(tài)對(duì)象:分為內(nèi)部靜態(tài)對(duì)象和外部靜態(tài)對(duì)象,生命期都是全局的,前者作用域?yàn)槎x它的函數(shù)體和程序塊內(nèi);后者作用域?yàn)槎x它的文件。,,,,對(duì)象的生存期,類(lèi)名允許與其他變量名或函數(shù)名同名,可通過(guò)下面方法實(shí)現(xiàn)正確的訪(fǎng)問(wèn): 1、如果一個(gè)非類(lèi)型名隱藏了類(lèi)型名,則類(lèi)型名通過(guò)加前綴class 訪(fǎng)問(wèn): class Sample { //… }; void func(i

19、nt Sample) //形參屏蔽了類(lèi)名 { class Sample a; //類(lèi)名前加class Sample++; //形參自增運(yùn)算 //… },,,,類(lèi)的可見(jiàn)性,2、如果一個(gè)類(lèi)型名隱藏了一個(gè)非類(lèi)型名,則用一般作用域規(guī)則訪(fǎng)問(wèn) int S=0; void func() { class S { … }

20、//類(lèi)S 屏蔽了全局變量S S a; //定義類(lèi)對(duì)象a ::S=3; //引用全局變量前加作用域符 } int g=S; //全局變量S 給變量g 初始化,,,,類(lèi)的可見(jiàn)性,與構(gòu)造函數(shù)相反,當(dāng)對(duì)象生存期結(jié)束時(shí),需要調(diào)用析構(gòu)函數(shù),釋放對(duì)象所占的內(nèi)存空間。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類(lèi)的一個(gè)公有成

21、員函數(shù),它的名稱(chēng)是在類(lèi)名前加“~”構(gòu)成,沒(méi)有返回值,和構(gòu)造函數(shù)不同的是析構(gòu)函數(shù)不接受任何參數(shù)。析構(gòu)函數(shù)是在對(duì)象生存期即將結(jié)束的時(shí)刻由系統(tǒng)自動(dòng)調(diào)用的。如果程序員沒(méi)有定義析構(gòu)函數(shù),系統(tǒng)將自動(dòng)生成和調(diào)用一個(gè)默認(rèn)析構(gòu)函數(shù)。 類(lèi)的析構(gòu)函數(shù)不能重載。,析構(gòu)函數(shù),如何調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),析構(gòu)函數(shù)的調(diào)用順序與相應(yīng)的構(gòu)造函數(shù)調(diào)用的順序相反。對(duì)象的存儲(chǔ)類(lèi)別可以改變調(diào)用析構(gòu)函數(shù)的順序。 1.全局定義的對(duì)象 在其他函數(shù)開(kāi)始執(zhí)行之前調(diào)用對(duì)象

22、的構(gòu)造函數(shù);當(dāng)main函數(shù)執(zhí)行結(jié)束時(shí),自動(dòng)調(diào)用對(duì)應(yīng)的析構(gòu)函數(shù);遇到exit和abort函數(shù)迫使程序立即結(jié)束,abort則不自動(dòng)調(diào)用對(duì)象的析構(gòu)函數(shù)。,如何調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),2. 自動(dòng)局部對(duì)象 定義對(duì)象時(shí),調(diào)用構(gòu)造函數(shù);當(dāng)對(duì)象的作用域結(jié)束時(shí),調(diào)用析構(gòu)函數(shù)。遇到exit和abort函數(shù)迫使程序立即結(jié)束,則不自動(dòng)調(diào)用自動(dòng)局部對(duì)象的析構(gòu)函數(shù)。,如何調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),3. static局部對(duì)象 static局部對(duì)象的構(gòu)造

23、函數(shù)在程序第一次執(zhí)行到該對(duì)象定義處時(shí)被調(diào)用一次;當(dāng)main函數(shù)執(zhí)行結(jié)束時(shí)和遇到exit ,自動(dòng)調(diào)用對(duì)應(yīng)的析構(gòu)函數(shù);abort函數(shù)迫使程序立即結(jié)束,則不自動(dòng)調(diào)用static對(duì)象的析構(gòu)函數(shù)。全局或者靜態(tài)對(duì)象的析構(gòu)函數(shù)調(diào)用順序與它們建立順序正好相反書(shū)例:P375-376,對(duì)象的賦值,如果對(duì)一個(gè)類(lèi)定義了兩個(gè)或多個(gè)對(duì)象,則這些同類(lèi)的對(duì)象之間可以互相賦值,或者說(shuō),一個(gè)對(duì)象的值可以賦給另一個(gè)同類(lèi)的對(duì)象。這里所指的對(duì)象的值是指對(duì)象中所有數(shù)據(jù)成員的值

24、。賦值運(yùn)算符(=)可以將一個(gè)對(duì)象賦給另一個(gè)類(lèi)型相同的對(duì)象。實(shí)際這個(gè)過(guò)程是通過(guò)數(shù)據(jù)成員復(fù)制來(lái)完成的,即將運(yùn)算符右邊對(duì)象的數(shù)據(jù)成員值一一復(fù)制給運(yùn)算符左邊另一對(duì)象的對(duì)應(yīng)成員。,對(duì)象的賦值,對(duì)象名1 = 對(duì)象名2;注意對(duì)象名1和對(duì)象名2必須屬于同一個(gè)類(lèi)。例如Time time1,time2; //定義兩個(gè)同類(lèi)的對(duì)象┆time2=time1; //將time1賦給time2,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論