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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、ME_H 作為一個標志,以便于條件編譯預處理指令進行測試。,宏定義,宏定義,定義位置:任意(通常放在文件開頭,函數(shù)之外)作用域:從定義命令到文件結束#undef 可終止宏名作用域 格式: #undef 標識符宏定義可嵌套,不能遞歸,例 #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相當于定義了不帶參宏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));,宏體及各形參外一般應加括號(),宏定義-帶參數(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ù)調用不會使源程序變長。 參數(shù):函數(shù)中

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

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

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

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

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

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

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

18、,生命期是全局的; 3、靜態(tài)對象:分為內部靜態(tài)對象和外部靜態(tài)對象,生命期都是全局的,前者作用域為定義它的函數(shù)體和程序塊內;后者作用域為定義它的文件。,,,,對象的生存期,類名允許與其他變量名或函數(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 初始化,,,,類的可見性,與構造函數(shù)相反,當對象生存期結束時,需要調用析構函數(shù),釋放對象所占的內存空間。與構造函數(shù)一樣,析構函數(shù)也是類的一個公有成

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

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

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

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

溫馨提示

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

評論

0/150

提交評論