面向?qū)ο蟪绦蛟O(shè)計(jì)課件第2章.ppt_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課件第2章.ppt_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課件第2章.ppt_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課件第2章.ppt_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)課件第2章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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、2.從C到C+,2.1 C+關(guān)鍵字,C中容許出現(xiàn)的字符: 26個(gè)大寫字母 26個(gè)小寫字母 10個(gè)數(shù)字 其他符號(hào):空格 + - * / = , . _ : ; ? | ! # % pi的不能作為lval,pi的值不能被改變 C中使用const常量而不提倡用符號(hào)常量。 原因:符號(hào)常量只是簡(jiǎn)單的替代并不做類型檢查,有可能產(chǎn)生類型不匹配的問(wèn)題。,const 定義,const定義常量格式如下: const = 或: const = 例如,前面提到的聲明: const double PI = 3.14; const int bufSize = 512; 或:int const bufSize = 512;

2、 數(shù)組常量的定義格式如下: const = ; 或: const = ; 例如: int const I_ARAAY3 = 1,2,3; const char NAME4 = J,A,C,K;,2.3 函數(shù),2.3.1 內(nèi)聯(lián)函數(shù)(inline函數(shù)) 2.3.2 重載函數(shù) 2.3.3 函數(shù)參數(shù)的默認(rèn)值 2.3.4 函數(shù)模板,2.3.1 內(nèi)聯(lián)函數(shù)(inline函數(shù)),1 常規(guī)的函數(shù)調(diào)用 時(shí)間開(kāi)銷 空間開(kāi)銷,#include using namespace std; double caclArea(int r); /函數(shù)聲明 int main() caclArea(1); caclArea(3);

3、caclArea(5); return 0; double caclArea(int r) return 3.1416*r*r; ,2 內(nèi)聯(lián)函數(shù)的執(zhí)行 程序無(wú)需跳轉(zhuǎn) 對(duì)內(nèi)聯(lián)函數(shù)而言,在程序編譯期間,編譯器將使用內(nèi)聯(lián)函數(shù)的函數(shù)體直接替換函數(shù)調(diào)用。因此,內(nèi)聯(lián)函數(shù)的運(yùn)行速度比常規(guī)函數(shù)稍快。 需要占用更多的空間 如果程序在10個(gè)不同的地方調(diào)用了同一個(gè)內(nèi)聯(lián)函數(shù),則程序?qū)摵瘮?shù)的10個(gè)代碼拷貝,因此如果函數(shù)代碼長(zhǎng)度過(guò)大,超出了跳轉(zhuǎn)語(yǔ)句所占空間的長(zhǎng)度,就會(huì)增加整個(gè)程序的代碼量,使程序運(yùn)行的空間開(kāi)銷大大增加了 內(nèi)聯(lián)的實(shí)質(zhì) 用空間來(lái)?yè)Q取時(shí)間空間開(kāi)銷增大了,時(shí)間開(kāi)銷卻減少了,從而提高了程序的執(zhí)行效率。,3 內(nèi)

4、聯(lián)函數(shù)的定義,在函數(shù)聲明前加上關(guān)鍵字inline。 在函數(shù)定義前加上關(guān)鍵字inline。 如: inline double caclArea(int r); inline double caclArea(int r) return 3.1416*r*r; 注:在函數(shù)定義處可用inline 關(guān)鍵字說(shuō)明函數(shù)為內(nèi)聯(lián)函數(shù)。如果函數(shù)定義在函數(shù)調(diào)用之后,則必須在函數(shù)聲明處就包括inline,否則就作為一般的函數(shù)處理。,例2-1 內(nèi)聯(lián)被當(dāng)作一般函數(shù)處理,#include using namespace std; double dCaclArea(double dr); /函數(shù)聲明,此處無(wú)inline int

5、 main() int i = 5 ; double dCirlcle; for(i = 1;i=5;i+) dCirlcle = dCaclArea(i); /實(shí)際沒(méi)有內(nèi)聯(lián),仍然調(diào)用 cout dCirlcle ; coutendl; getchar(); return 0; inline double dCaclArea (double dr)/此處為內(nèi)聯(lián) return 3.1416*dr*dr; ,4 用內(nèi)聯(lián)函數(shù)替代宏,#define SQUARE(X) X*X 這并不是通過(guò)傳遞參數(shù)實(shí)現(xiàn)的,而是通過(guò)文本替換來(lái)實(shí)現(xiàn)的,看下面的幾個(gè)語(yǔ)句: (1)a = SQUARE(4) ; (2)a =

6、SQUARE(4+5); (3)int b = 2;a = SQUARE(b+); (4)a = SQUARE(”hello”);,inline double SQUARE(double x) return x*x; ,5 內(nèi)聯(lián)函數(shù)的限制,(1)內(nèi)聯(lián)函數(shù)中通常不包括復(fù)雜結(jié)構(gòu)控制語(yǔ)句,如switch、while語(yǔ)句、復(fù)雜語(yǔ)句嵌套,否則,系統(tǒng)將作為一般函數(shù)處理。 (2)遞歸函數(shù)不能被作為內(nèi)聯(lián)函數(shù)。 (3)內(nèi)聯(lián)函數(shù)只適合于只有15行的小函數(shù)。 (4)在類結(jié)構(gòu)中,在類體內(nèi)定義的函數(shù)成員都是內(nèi)聯(lián)函數(shù)。,2.3.2 重載函數(shù),1.重載函數(shù)引入的原因 int iMax(int,int ); float fM

7、ax(float,float ); double dMax(double,double );,希望是,int Max(int,int ); float Max(float,float ); double Max(double,double );,2重載函數(shù)的匹配,在函數(shù)同名的情況下,編譯器是根據(jù)函數(shù)的參數(shù)列表。它是函數(shù)重載的關(guān)鍵。如果兩個(gè)函數(shù)的參數(shù)數(shù)目和類型相同,同時(shí)參數(shù)的排列順序也相同,則它們的特征標(biāo)相同,如果參數(shù)列表相同僅有函數(shù)返回值類型不同,是不能夠重載的。 下面的幾個(gè)重載函數(shù)就具有不同參數(shù)列表: int add(int a, int b); double add(double a,do

8、uble b); float add(folat a, folat b),重載函數(shù)的匹配,當(dāng)某個(gè)函數(shù)中調(diào)用重載函數(shù)時(shí),編譯器會(huì)根據(jù)實(shí)參類型調(diào)用相應(yīng)的函數(shù)。匹配的過(guò)程按如下步驟進(jìn)行: 如果有嚴(yán)格的匹配的函數(shù),就調(diào)用該函數(shù)。 參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,則調(diào)用該函數(shù)。 通過(guò)用戶定義的轉(zhuǎn)換尋求匹配。 例如,如下兩個(gè)重載函數(shù): void fun(int); void fun(doulbe); 對(duì)于下列調(diào)用函數(shù)fun()匹配情況如下: fun(2); /匹配void fun (int),嚴(yán)格匹配 fun(2.5); /匹配void fun(double),嚴(yán)格匹配 fun(a); /匹配void fun (

9、int),內(nèi)部轉(zhuǎn)換后匹配 fun(doulbe)6) /匹配void fun(double),強(qiáng)制類型轉(zhuǎn)換后匹配。,void fun(long); void fun(doulbe); int main() int i = 5; fun(i); ,使用重載函數(shù)時(shí)的注意事項(xiàng):,(1)不能使用類型定義typedef語(yǔ)句定義的類型名來(lái)區(qū)分重載函數(shù)中聲明的參數(shù)。例如,下面的函數(shù)重載是不正確的。 typedef int INT; void fun(int); void fun(INT)/錯(cuò)誤!函數(shù)重復(fù)定義 (2)重載函數(shù)應(yīng)當(dāng)具有相同或類似的功能,如果讓同名函數(shù)執(zhí)行不同的功能,則程序的可讀性受到破壞,這不是

10、一個(gè)良好的編程風(fēng)格。,3.重載函數(shù)應(yīng)用舉例,例2-2 求兩個(gè)操作數(shù)之和。 #include using namespace std; int add(int,int); double add(double,double); int main( ) coutadd(5,10)endl; coutadd(5.0,10.5)endl; getchar(); return 0; int add(int x,int y) return x+y; double add(double a,double b) return a+b; ,程序的輸出結(jié)果為: 15 155,例2-3 找出幾個(gè)int型中的最小值,#

11、include using namespace std; int min(int a,int b); int min(int a,int b,int c); int min(int a,int b,int c,int d); int main( ) cout min(13,5,4,2)endl; cout min(13,5,4)endl; cout min(13,5)endl; getchar(); return 0; ,程序的輸出結(jié)果為: 2 4 5,int min(int a,int b) return ab?a:b; int min(int a,int b,int c) int t =

12、min(a,b); return min(t,c); int min(int a,int b,int c,int d) int t1 = min(a,b,c); return min(t1,d); ,2.3.3 函數(shù)參數(shù)的默認(rèn)值,默認(rèn)參數(shù)指的是當(dāng)函數(shù)調(diào)用中省略了實(shí)參時(shí),自動(dòng)使用的一個(gè)值。如何設(shè)置默認(rèn)值呢?必須通過(guò)函數(shù)的原型。由于編譯器是通過(guò)檢查原型來(lái)了解函數(shù)所使用的參數(shù)數(shù)目,因此函數(shù)原型必須將可能的默認(rèn)參數(shù)告知程序。方法是將值賦給原型中的參數(shù)。如: int funtion(int n,int m = 4); 函數(shù)默認(rèn)參數(shù)聲明的語(yǔ)法格式如下: 返回值類型函數(shù)名(形參1,形參n-1 = 默認(rèn)值,形

13、參n = 默認(rèn)值),注意事項(xiàng),(1)帶有默認(rèn)值的參數(shù)在調(diào)用時(shí),對(duì)于默認(rèn)參數(shù),可以給出實(shí)參值,也可以不給出實(shí)參值。如果給出,則將實(shí)參傳遞給形參,否則,將按照形參調(diào)用。,例2-4 帶默認(rèn)參數(shù)值的函數(shù),#include using namespace std; void fun(int a=1,int b=2,int c=3) couta=a,b=b, c=cendl; int main( ) fun( ); fun(9); fun(4,5); fun(7,8,9); return 0; ,程序的輸出結(jié)果為: a=1,b=2,c=3 a=9,b=2,c=3 a=4,b=5,c=3 a=7,b=8,c

14、=9,(2)默認(rèn)參數(shù)并不一定是常量,它可以是任意的表達(dá)式,甚至可以通過(guò)函數(shù)調(diào)用給出。如果默認(rèn)參數(shù)是表達(dá)式,則函數(shù)每次調(diào)用時(shí),該表達(dá)式將被重新求值。默認(rèn)值一般是全局變量,而不是局部變量,因?yàn)槟J(rèn)參數(shù)的調(diào)用是在編譯時(shí)去確定的,而局部變量編譯時(shí)無(wú)法確定。,例2-5 帶默認(rèn)參數(shù)值的函數(shù),#include using namespace std; int q(5),p(7); int sum_int(int a,int b=p+q,int c=q*p); int main( ) int x(5),y(10); int s1=sum_int(x); int s2=sum_int(x,y); couts1=

15、s1ns2=s2endl; return 0; ,int sum_int(int a,int b,int c) return a+b+c; ,程序的輸出結(jié)果為: s1=52 s1=50,(3)對(duì)于帶參數(shù)列表的函數(shù),必須從右向左添加默認(rèn)值。也就是說(shuō),要為某個(gè)參數(shù)設(shè)置默認(rèn)值,則必須為它右邊的所有參數(shù)提供默認(rèn)值,下面的函數(shù)原型說(shuō)明中,有些是不正確的。 int fun(int m,int n = 3,int j = 5); int fun(int m,int n = 3,int j ); int fun(int m = 1,int n = 3,int j = 5 );,在調(diào)用函數(shù)時(shí),實(shí)參按照從左到右的

16、順序依次被賦值給相應(yīng)的形參,而不能跳過(guò)任何參數(shù),因此,下面的函數(shù)調(diào)用中,有些也是不允許的。 int results; results = fun(1); results = fun(1,8) results = fun(1,7,8) results = fun(1,8);,(4)注意帶有默認(rèn)參數(shù)的重載函數(shù)所引起的二義性。二義性問(wèn)題實(shí)際上就是編譯器不能確定該語(yǔ)句究竟是什么意思,可以作出多種解釋。函數(shù)重載時(shí),尤其在有默認(rèn)參數(shù)的情況下,很容易引發(fā)二義性的問(wèn)題。 int fun(int m,int n,int j = 5); int fun(int m,int n = 3,int j=5 ); int

17、 fun(int m = 1,int n = 3,int j = 5 ); fun(1,5),2.3.4 函數(shù)模板,1 為什么要使用函數(shù)模板? int add(int a, int b) return a+b; float add(float a, float b) return a+b; ,希望,T add(T a, T b) return a+b; ,2 函數(shù)模板及其定義,函數(shù)模板的一般定義格式如下: template (形式參數(shù)表) /函數(shù)體 ,注:模板類型參數(shù)代表一種類型,用關(guān)鍵字typename或 class后加一個(gè)標(biāo)識(shí)符構(gòu)成,在這里,兩個(gè)關(guān)鍵字的意義相同,它們表示后面的參數(shù)名代表一

18、個(gè)潛在的內(nèi)置或用戶定義的類型。,示例,template void Swap(AnyType ,3 實(shí)例化函數(shù)模板,所謂實(shí)例化函數(shù)模板,就是編輯器根據(jù)函數(shù)調(diào)用時(shí)具體的參數(shù)類型,按照模板樣式,創(chuàng)建具體函數(shù)的過(guò)程。 在編譯過(guò)程中,當(dāng)編譯器發(fā)現(xiàn)有一個(gè)函數(shù)調(diào)用()時(shí),它將根據(jù)中的具體類型實(shí)參生成一個(gè)重載函數(shù)即模板函數(shù)。該模板函數(shù)的定義體與函數(shù)模板的定義體相同,而類型則以類型來(lái)代替。,例2-6 交換兩個(gè)數(shù)的函數(shù)模版,#include /函數(shù)模板原型 template / 或者是 tempplate void Swap(AnyType ,/函數(shù)模板定義 template/ 或者是tempplate void Swap(AnyType ,4 函數(shù)模板與模板函數(shù),函數(shù)模板與模板函數(shù)的主要區(qū)別在于: (1)函數(shù)模板不是一個(gè)函數(shù),而是對(duì)一組函數(shù)的描述,是一組函數(shù)的模板,在定義時(shí)使用了參數(shù)化類型。 (2)模板函數(shù)是一種實(shí)實(shí)在在的函數(shù)定義,它的函數(shù)體與某個(gè)函數(shù)模板的函數(shù)體相同,編譯器遇到模板函數(shù)調(diào)用時(shí),將生成可執(zhí)行代碼。,5 重載函數(shù)模板,函數(shù)模板與普通函數(shù)一樣,也可以重載。這里包含兩種含義,第一種是可以像重載常規(guī)函數(shù)定義那樣重載模板定義,另一種重載常規(guī)函數(shù)定義。下面我們

溫馨提示

  • 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)論