2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

3、ME_H 作為一個標(biāo)志,以便于條件編譯預(yù)處理指令進(jìn)行測試。,宏定義,宏定義,定義位置:任意(通常放在文件開頭,函數(shù)之外)作用域:從定義命令到文件結(jié)束#undef 可終止宏名作用域 格式: #undef 標(biāo)識符宏定義可嵌套,不能遞歸,例 #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、,宏展開:形參用實參換,其它字符保留,例 #define S(a,b) a*b ……….. area=S(3,2);宏展開: area=3*2;,不能加空格,宏定義-帶參數(shù)宏定義,宏定義-帶參數(shù)宏定義,例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展開:z=x+y*x+y;一般寫

7、成: #define POWER(x) ((x)*(x))宏展開: z=((x+y)*(x+y));,宏體及各形參外一般應(yīng)加括號(),宏定義-帶參數(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); ……}宏展開: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ù)實現(xiàn)同樣的功能,帶參的宏與函數(shù)區(qū)別,處理時間:宏是在編譯前,函數(shù)是在運行時。 程序執(zhí)行速度:宏(不占運行時間)比函數(shù)快。 程序代碼長度:使用宏的源程序代碼會變長,而函數(shù)調(diào)用不會使源程序變長。 參數(shù):函數(shù)中

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

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

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

14、#ifdef等價于#if defined#ifndef等價于#if !defined,條件編譯,有一個數(shù)據(jù)類型,在Windows平臺中,應(yīng)該使用long類型表示,而在其他平臺應(yīng)該使用 float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。可以用以下的條件編譯: #ifdef WINDOWS #define MYTYPE long #else #define MYTYPE fl

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論