版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2.從C到C++2.從C到C++2.1C++關(guān)鍵字C++中容許出現(xiàn)的字符:26個大寫字母26個小寫字母10個數(shù)字其他符號:空格+-*/=,._:;?\"'~|!#%&()[]{}^
<2.1C++關(guān)鍵字C++中容許出現(xiàn)的字符:C++標(biāo)識符的命名規(guī)則標(biāo)識由英文字母、數(shù)字和下劃線符號“_”構(gòu)成,長度不限。英文字母區(qū)分大小寫。標(biāo)識不可以數(shù)字開頭。不可以使用C++內(nèi)設(shè)的關(guān)鍵字(keywords)。C++標(biāo)識符的命名規(guī)則標(biāo)識由英文字母、數(shù)字和下劃線符號“_C++的常用關(guān)鍵字及其分類數(shù)據(jù)類型說明符與修飾符boolcharclassconstdoubleenumfloatintlongshortsignedstructunionusignedvoidvolatilewchar_t存儲類型說明符autoexterninlineregisterstatic訪問類型說明符friendprivateprotectedpublic語句breakcasecatchcontinuedefaultdoelseforgotoifreturnswitchthrowtrywhile運算符deletefalsenewsizeoftrue其他說明符asmexplicitnamespaceoperatortemplatethistypedeftypenameusingvirtualC++的常用關(guān)鍵字及其分類數(shù)據(jù)類型說明符與修飾符bool2.2const常量符號常量:用一個標(biāo)識符代表的常量,即:在程序中用#define
命令定義某個符號所代表的常量。例如:#defineW”女”#defineM”男”#definePRICE123.789注意:
1.一旦定義了某個符號代表一個常量,則該符號在其作用域內(nèi)就表示這個常量
2.符號常量不是變量,在其作用域內(nèi)不能被賦值
3.為提高程序的可讀性,符號常量一般用大寫表示2.2const常量符號常量:用一個標(biāo)識符代表的常量,即const常量:凍結(jié)變量例:constdoublepi=3.14159265;pi的不能作為lval,pi的值不能被改變C++中使用const常量而不提倡用符號常量。原因:符號常量只是簡單的替代并不做類型檢查,有可能產(chǎn)生類型不匹配的問題。const常量:凍結(jié)變量例:constdoublepiconst定義const定義常量格式如下:const<已知類型><C++合法標(biāo)識>=<初始化對象的表達(dá)式>或:<已知類型>const<C++合法標(biāo)識>=<初始化對象的表達(dá)式> 例如,前面提到的聲明: constdoublePI=3.14; constintbufSize=512; 或:intconstbufSize=512; 數(shù)組常量的定義格式如下: <類型>const<數(shù)組名>[<大小>]={<初值表>}; 或: const<類型><數(shù)組名>[<大小>]={<初值表>}; 例如:
intconstI_ARAAY[3]={1,2,3};constcharNAME[4]={‘J’,’A’,’C’,’K’};const定義const定義常量格式如下: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函數(shù)2.3.1內(nèi)聯(lián)函數(shù)(inline函數(shù))2.3.1內(nèi)聯(lián)函數(shù)(inline函數(shù))1常規(guī)的函數(shù)調(diào)用時間開銷空間開銷2.3.1內(nèi)聯(lián)函數(shù)(inline函數(shù))1常規(guī)的函數(shù)調(diào)用#include<iostream>usingnamespacestd;doublecaclArea(intr);//函數(shù)聲明intmain(){ …… caclArea(1);……caclArea(3);……caclArea(5);……return0;}doublecaclArea(intr){ return3.1416*r*r;}#include<iostream>2內(nèi)聯(lián)函數(shù)的執(zhí)行程序無需跳轉(zhuǎn)對內(nèi)聯(lián)函數(shù)而言,在程序編譯期間,編譯器將使用內(nèi)聯(lián)函數(shù)的函數(shù)體直接替換函數(shù)調(diào)用。因此,內(nèi)聯(lián)函數(shù)的運行速度比常規(guī)函數(shù)稍快。需要占用更多的空間如果程序在10個不同的地方調(diào)用了同一個內(nèi)聯(lián)函數(shù),則程序?qū)摵瘮?shù)的10個代碼拷貝,因此如果函數(shù)代碼長度過大,超出了跳轉(zhuǎn)語句所占空間的長度,就會增加整個程序的代碼量,使程序運行的空間開銷大大增加了內(nèi)聯(lián)的實質(zhì)用空間來換取時間——空間開銷增大了,時間開銷卻減少了,從而提高了程序的執(zhí)行效率。2內(nèi)聯(lián)函數(shù)的執(zhí)行面向?qū)ο蟪绦蛟O(shè)計課件第2章3內(nèi)聯(lián)函數(shù)的定義在函數(shù)聲明前加上關(guān)鍵字inline。在函數(shù)定義前加上關(guān)鍵字inline。如:inlinedoublecaclArea(intr);inlinedoublecaclArea(intr){ return3.1416*r*r;}注:在函數(shù)定義處可用inline關(guān)鍵字說明函數(shù)為內(nèi)聯(lián)函數(shù)。如果函數(shù)定義在函數(shù)調(diào)用之后,則必須在函數(shù)聲明處就包括inline,否則就作為一般的函數(shù)處理。3內(nèi)聯(lián)函數(shù)的定義在函數(shù)聲明前加上關(guān)鍵字inline。
[例2-1]內(nèi)聯(lián)被當(dāng)作一般函數(shù)處理#include<iostream>usingnamespacestd;doubledCaclArea(doubledr);//函數(shù)聲明,此處無inlineintmain(){ inti=5; doubledCirlcle; for(i=1;i<=5;i++) { dCirlcle=dCaclArea(i);//實際沒有內(nèi)聯(lián),仍然調(diào)用
cout<<dCirlcle<<";";}cout<<endl;getchar();return0;}inlinedoubledCaclArea(doubledr)//此處為內(nèi)聯(lián){ return3.1416*dr*dr;}[例2-1]內(nèi)聯(lián)被當(dāng)作一般函數(shù)處理#include<4用內(nèi)聯(lián)函數(shù)替代宏#defineSQUARE(X)X*X這并不是通過傳遞參數(shù)實現(xiàn)的,而是通過文本替換來實現(xiàn)的,看下面的幾個語句:(1)a=SQUARE(4);(2)a=SQUARE(4+5);(3)intb=2;a=SQUARE(b++);(4)a=SQUARE(”hello”);inlinedoubleSQUARE(doublex){returnx*x;}
4用內(nèi)聯(lián)函數(shù)替代宏#defineSQUARE(X)X*5內(nèi)聯(lián)函數(shù)的限制(1)內(nèi)聯(lián)函數(shù)中通常不包括復(fù)雜結(jié)構(gòu)控制語句,如switch、while語句、復(fù)雜語句嵌套,否則,系統(tǒng)將作為一般函數(shù)處理。(2)遞歸函數(shù)不能被作為內(nèi)聯(lián)函數(shù)。(3)內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)。(4)在類結(jié)構(gòu)中,在類體內(nèi)定義的函數(shù)成員都是內(nèi)聯(lián)函數(shù)。5內(nèi)聯(lián)函數(shù)的限制(1)內(nèi)聯(lián)函數(shù)中通常不包括復(fù)雜結(jié)構(gòu)控制語2.3.2重載函數(shù)1.重載函數(shù)引入的原因intiMax(int,int);floatfMax(float,float);doubledMax(double,double);2.3.2重載函數(shù)1.重載函數(shù)引入的原因希望是intMax(int,int);floatMax(float,float);doubleMax(double,double);希望是intMax(int,int);2.重載函數(shù)的匹配在函數(shù)同名的情況下,編譯器是根據(jù)函數(shù)的參數(shù)列表。它是函數(shù)重載的關(guān)鍵。如果兩個函數(shù)的參數(shù)數(shù)目和類型相同,同時參數(shù)的排列順序也相同,則它們的特征標(biāo)相同,如果參數(shù)列表相同僅有函數(shù)返回值類型不同,是不能夠重載的。下面的幾個重載函數(shù)就具有不同參數(shù)列表:intadd(inta,intb);doubleadd(doublea,doubleb);floatadd(folata,folatb)2.重載函數(shù)的匹配在函數(shù)同名的情況下,編譯器重載函數(shù)的匹配當(dāng)某個函數(shù)中調(diào)用重載函數(shù)時,編譯器會根據(jù)實參類型調(diào)用相應(yīng)的函數(shù)。匹配的過程按如下步驟進(jìn)行:如果有嚴(yán)格的匹配的函數(shù),就調(diào)用該函數(shù)。參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,則調(diào)用該函數(shù)。通過用戶定義的轉(zhuǎn)換尋求匹配。例如,如下兩個重載函數(shù):voidfun(int);voidfun(doulbe);對于下列調(diào)用函數(shù)fun()匹配情況如下:fun(2); //匹配voidfun(int),嚴(yán)格匹配fun(2.5); //匹配voidfun(double),嚴(yán)格匹配fun(‘a(chǎn)’); //匹配voidfun(int),內(nèi)部轉(zhuǎn)換后匹配fun((doulbe)6)//匹配voidfun(double),強制類型轉(zhuǎn)換后匹配。重載函數(shù)的匹配當(dāng)某個函數(shù)中調(diào)用重載函數(shù)時,編譯器會根voidfun(long);voidfun(doulbe);intmain(){ inti=5; fun(i);}voidfun(long);使用重載函數(shù)時的注意事項:(1)不能使用類型定義typedef語句定義的類型名來區(qū)分重載函數(shù)中聲明的參數(shù)。例如,下面的函數(shù)重載是不正確的。 typedefintINT; voidfun(int); voidfun(INT)//錯誤!函數(shù)重復(fù)定義(2)重載函數(shù)應(yīng)當(dāng)具有相同或類似的功能,如果讓同名函數(shù)執(zhí)行不同的功能,則程序的可讀性受到破壞,這不是一個良好的編程風(fēng)格。使用重載函數(shù)時的注意事項:(1)不能使用類型定義typede3.重載函數(shù)應(yīng)用舉例[例2-2]求兩個操作數(shù)之和。#include<iostream>usingnamespacestd;intadd(int,int);doubleadd(double,double);intmain(){ cout<<add(5,10)<<endl; cout<<add(5.0,10.5)<<endl; getchar(); return0;}intadd(intx,inty){ returnx+y;}doubleadd(doublea,doubleb){ returna+b;}程序的輸出結(jié)果為:1515.53.重載函數(shù)應(yīng)用舉例[例2-2]求兩個操作數(shù)之和。程序的輸[例2-3]找出幾個int型中的最小值#include<iostream>usingnamespacestd;intmin(inta,intb);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);intmain(){cout<<min(13,5,4,2)<<endl; cout<<min(13,5,4)<<endl;cout<<min(13,5)<<endl;getchar(); return0;}程序的輸出結(jié)果為:245[例2-3]找出幾個int型中的最小值#include<intmin(inta,intb){ returna<b?a:b;}intmin(inta,intb,intc){intt=min(a,b);returnmin(t,c);}intmin(inta,intb,intc,intd){ intt1=min(a,b,c);returnmin(t1,d);}intmin(inta,intb)2.3.3函數(shù)參數(shù)的默認(rèn)值默認(rèn)參數(shù)指的是當(dāng)函數(shù)調(diào)用中省略了實參時,自動使用的一個值。如何設(shè)置默認(rèn)值呢?必須通過函數(shù)的原型。由于編譯器是通過檢查原型來了解函數(shù)所使用的參數(shù)數(shù)目,因此函數(shù)原型必須將可能的默認(rèn)參數(shù)告知程序。方法是將值賦給原型中的參數(shù)。如:intfuntion(intn,intm=4);函數(shù)默認(rèn)參數(shù)聲明的語法格式如下: 返回值類型 函數(shù)名(形參1,…,形參n-1=默認(rèn)值,形參n=默認(rèn)值)2.3.3函數(shù)參數(shù)的默認(rèn)值默認(rèn)參數(shù)指的是當(dāng)函數(shù)調(diào)用注意事項(1)帶有默認(rèn)值的參數(shù)在調(diào)用時,對于默認(rèn)參數(shù),可以給出實參值,也可以不給出實參值。如果給出,則將實參傳遞給形參,否則,將按照形參調(diào)用。注意事項(1)帶有默認(rèn)值的參數(shù)在調(diào)用時,對于默認(rèn)參數(shù),可以給[例2-4]帶默認(rèn)參數(shù)值的函數(shù)#include<iostream>usingnamespacestd;voidfun(inta=1,intb=2,intc=3){ cout<<"a="<<a<<','<<"b="<<b<<',‘ <<"c="<<c<<endl;}intmain(){fun();fun(9);fun(4,5);fun(7,8,9); return0;}程序的輸出結(jié)果為:a=1,b=2,c=3a=9,b=2,c=3a=4,b=5,c=3a=7,b=8,c=9[例2-4]帶默認(rèn)參數(shù)值的函數(shù)#include<iost(2)默認(rèn)參數(shù)并不一定是常量,它可以是任意的表達(dá)式,甚至可以通過函數(shù)調(diào)用給出。如果默認(rèn)參數(shù)是表達(dá)式,則函數(shù)每次調(diào)用時,該表達(dá)式將被重新求值。默認(rèn)值一般是全局變量,而不是局部變量,因為默認(rèn)參數(shù)的調(diào)用是在編譯時去確定的,而局部變量編譯時無法確定。(2)默認(rèn)參數(shù)并不一定是常量,它可以是任意的表達(dá)式,甚至可以[例2-5]帶默認(rèn)參數(shù)值的函數(shù)#include<iostream>usingnamespacestd;intq(5),p(7);intsum_int(inta,intb=p+q,intc=q*p);intmain(){intx(5),y(10);ints1=sum_int(x);ints2=sum_int(x,y);cout<<"s1="<<s1<<'\n'<<"s2="<<s2<<endl; return0;}[例2-5]帶默認(rèn)參數(shù)值的函數(shù)#include<iostintsum_int(inta,intb,intc){returna+b+c;}程序的輸出結(jié)果為:s1=52s1=50intsum_int(inta,intb,intc)(3)對于帶參數(shù)列表的函數(shù),必須從右向左添加默認(rèn)值。也就是說,要為某個參數(shù)設(shè)置默認(rèn)值,則必須為它右邊的所有參數(shù)提供默認(rèn)值,下面的函數(shù)原型說明中,有些是不正確的。intfun(intm,intn=3,intj=5); intfun(intm,intn=3,intj); intfun(intm=1,intn=3,intj=5); (3)對于帶參數(shù)列表的函數(shù),必須從右向左添加默認(rèn)值。也就是說在調(diào)用函數(shù)時,實參按照從左到右的順序依次被賦值給相應(yīng)的形參,而不能跳過任何參數(shù),因此,下面的函數(shù)調(diào)用中,有些也是不允許的。intresults;results=fun(1); results=fun(1,8)results=fun(1,7,8)results=fun(1,,8); 在調(diào)用函數(shù)時,實參按照從左到右的順序依次被賦(4)注意帶有默認(rèn)參數(shù)的重載函數(shù)所引起的二義性。二義性問題實際上就是編譯器不能確定該語句究竟是什么意思,可以作出多種解釋。函數(shù)重載時,尤其在有默認(rèn)參數(shù)的情況下,很容易引發(fā)二義性的問題。intfun(intm,intn,intj=5); intfun(intm,intn=3,intj=5); intfun(intm=1,intn=3,intj=5);fun(1,5)(4)注意帶有默認(rèn)參數(shù)的重載函數(shù)所引起的二義性。二義性問題實2.3.4函數(shù)模板1為什么要使用函數(shù)模板?intadd(inta,intb){ returna+b;}floatadd(floata,floatb){ returna+b;}2.3.4函數(shù)模板1為什么要使用函數(shù)模板?希望Tadd(Ta,Tb){ returna+b;}希望Tadd(Ta,Tb)2函數(shù)模板及其定義函數(shù)模板的一般定義格式如下:template<(模板參數(shù)表)><返回值類型><函數(shù)名>(形式參數(shù)表){ //函數(shù)體}注:模板類型參數(shù)代表一種類型,用關(guān)鍵字typename或class后加一個標(biāo)識符構(gòu)成,在這里,兩個關(guān)鍵字的意義相同,它們表示后面的參數(shù)名代表一個潛在的內(nèi)置或用戶定義的類型。
2函數(shù)模板及其定義函數(shù)模板的一般定義格式如下:注:模板類示例template<typenameAnyType>voidSwap(AnyType&a,AnyType&b){AnyTypetemp;temp=a;a=b;b=temp;}示例template<typenameAnyType>3實例化函數(shù)模板所謂實例化函數(shù)模板,就是編輯器根據(jù)函數(shù)調(diào)用時具體的參數(shù)類型,按照模板樣式,創(chuàng)建具體函數(shù)的過程。在編譯過程中,當(dāng)編譯器發(fā)現(xiàn)有一個函數(shù)調(diào)用<函數(shù)名>(<實參表>)時,它將根據(jù)<實參表>中的具體類型實參生成一個重載函數(shù)即模板函數(shù)。該模板函數(shù)的定義體與函數(shù)模板的定義體相同,而<型參表>類型則以<實參表>類型來代替。3實例化函數(shù)模板所謂實例化函數(shù)模板,就是編[例2-6]交換兩個數(shù)的函數(shù)模版#include<iostream>//函數(shù)模板原型template<typenameAnyType>//或者是tempplate<classAnyType>voidSwap(AnyType&a,AnyType&b);intmain(){usingnamespacestd;inti=10;intj=20;cout<<"i,j="<<i<<","<<j<<"\n";cout<<"Usingcompilergenerateintswapper:\n";Swap(i,j);//生成函數(shù)VoidSwap(int&,int&)cout<<"Nowi,j="<<i<<","<<j<<"\n";doublex=2.45;doubley=8.17;cout<<"x,y="<<x<<","<<y<<"\n";cout<<"Usingcompilergeneratedoubleswapper:\n";Swap(x,y);//生成函數(shù)VoidSwap(double&,double&)cout<<"Nowx,y="<<x<<","<<y<<".\n";getchar();return0;}[例2-6]交換兩個數(shù)的函數(shù)模版#include<io//函數(shù)模板定義template<typenameAnyType>//或者是tempplate<classAnyType>voidSwap(AnyType&a,AnyType&b){AnyTypetemp;//temp是一個AnyType類型的變量
temp=a;a=b;b=temp;}//函數(shù)模板定義4函數(shù)模板與模板函數(shù)函數(shù)模板與模板函數(shù)的主要區(qū)別在于:(1)函數(shù)模板不是一個函數(shù),而是對一組函數(shù)的描述,是一組函數(shù)的模板,在定義時使用了參數(shù)化類型。(2)模板函數(shù)是一種實實在在的函數(shù)定義,它的函數(shù)體與某個函數(shù)模板的函數(shù)體相同,編譯器遇到模板函數(shù)調(diào)用時,將生成可執(zhí)行代碼。4函數(shù)模板與模板函數(shù)函數(shù)模板與模板函數(shù)的主要區(qū)別在于:5重載函數(shù)模板函數(shù)模板與普通函數(shù)一樣,也可以重載。這里包含兩種含義,第一種是可以像重載常規(guī)函數(shù)定義那樣重載模板定義,另一種重載常規(guī)函數(shù)定義。下面我們分別通過舉例來說明這兩種重載函數(shù)模板的情形。5重載函數(shù)模板函數(shù)模板與普通函數(shù)一樣,也可以重載。這里包含(1)重載函數(shù)模板定義[例2-7]重載函數(shù)模板定義——兩個Swap函數(shù)模板重載#include<iostream>template<typenameAnyType>//原來定義的模板voidSwap(AnyType&a,AnyType&b);template<typenameAnyType>//新定義的模板voidSwap(AnyType*a,AnyType*b,intn);voidshow(inta[]);constintLim=8;intmain(){ usingnamespacestd; inti=10,j=20; cout<<"i,j="<<i<<","<<j<<".\n"; cout<<"Usingcompilergenerateintswapper:\n"; Swap(i,j);//匹配原來的模板
cout<<"Nowi,j="<<i<<","<<j<<".\n"; intd1[Lim]={0,7,0,4,1,7,7,6}; intd2[Lim]={0,6,2,0,1,9,6,9}; cout<<"Originalarrays:\n"; show(d1); show(d2); Swap(d1,d2,Lim); //匹配新模板
cout<<"Swappedarrays:\n"; show(d1); show(d2);
getchar(); return0;}(1)重載函數(shù)模板定義[例2-7]重載函數(shù)模板定義——兩template<typenameAnyType>voidSwap(AnyType&a,AnyType&b){ AnyTypetemp; temp=a; a=b; b=temp;}template<typenameAnyType>voidSwap(AnyTypea[],AnyTypeb[],intn){ AnyTypetemp; for(inti=0;i<n;i++) {temp=a[i];a[i]=b[i];b[i]=temp;}}voidshow(inta[]){ usingnamespacestd; cout<<a[0]<<a[1]<<"/"; cout<<a[2]<<a[3]<<"/"; for(inti=4;i<Lim;i++)cout<<a[i];cout<<endl;}template<typenameAnyType>輸出結(jié)果:i,j=10,20.Usingcompilergenerateintswapper:Nowi,j=20,10.Originalarrays:07/04/177607/20/1969Swappedarrays:06/20/196907/04/1776輸出結(jié)果:(2)重載常規(guī)函數(shù)對于重載常規(guī)函數(shù)而言,編譯器的靜態(tài)綁定1過程是遵循如下規(guī)則的:①首先匹配類型完全相同的重載函數(shù)。②其次才尋求函數(shù)模板來匹配。(2)重載常規(guī)函數(shù)對于重載常規(guī)函數(shù)而言,編譯器的靜態(tài)綁定1[例2-8]重載函數(shù)與函數(shù)模板的匹配過程#include<iostream>usingnamespacestd;voidSwap(int&a,int&b);//新的重載函數(shù)template<typenameAnyType>//原來的模板voidSwap(AnyType&a,AnyType&b);intmain(){ inti=10,j=20; cout<<"i,j="<<i<<","<<j<<"\n"; Swap(i,j);//匹配重載函數(shù)
cout<<"Nowi,j="<<i<<","<<j<<".\n"; doublex=2.45,y=8.17; cout<<"x,y="<<x<<","<<y<<"\n"; Swap(x,y);//匹配模板
cout<<"Nowx,y="<<x<<","<<y<<"\n"; charc1='A',c2='B'; cout<<"c1,c2="<<c1<<","<<c2<<"\n"; Swap(c1,c2);//匹配模板
cout<<"Nowc1,c2="<<c1<<","<<c2<<"\n"; getchar(); return0;}[例2-8]重載函數(shù)與函數(shù)模板的匹配過程#includevoidSwap(int&a,int&b)//重載函數(shù)定義{ cout<<"UsingintSwapfunction:\n"; inttemp;temp=a;a=b;b=temp;}template<typenameAnyType>voidSwap(AnyType&a,AnyType&b){ cout<<"Usingtemplatefunction:\n"; AnyTypetemp;temp=a;a=b;b=temp;}voidSwap(int&a,int&b)//重程序的執(zhí)行結(jié)果如下:i,j=10,20UsingintSwapfunction:Nowi,j=20,10x,y=2.45,8.17Usingtemplatefunction:Nowx,y=8.17,2.45Usingtemplatefunction:c1,c2=A,Bnowc1,c2=B,A程序的執(zhí)行結(jié)果如下:2.從C到C++2.從C到C++2.1C++關(guān)鍵字C++中容許出現(xiàn)的字符:26個大寫字母26個小寫字母10個數(shù)字其他符號:空格+-*/=,._:;?\"'~|!#%&()[]{}^
<2.1C++關(guān)鍵字C++中容許出現(xiàn)的字符:C++標(biāo)識符的命名規(guī)則標(biāo)識由英文字母、數(shù)字和下劃線符號“_”構(gòu)成,長度不限。英文字母區(qū)分大小寫。標(biāo)識不可以數(shù)字開頭。不可以使用C++內(nèi)設(shè)的關(guān)鍵字(keywords)。C++標(biāo)識符的命名規(guī)則標(biāo)識由英文字母、數(shù)字和下劃線符號“_C++的常用關(guān)鍵字及其分類數(shù)據(jù)類型說明符與修飾符boolcharclassconstdoubleenumfloatintlongshortsignedstructunionusignedvoidvolatilewchar_t存儲類型說明符autoexterninlineregisterstatic訪問類型說明符friendprivateprotectedpublic語句breakcasecatchcontinuedefaultdoelseforgotoifreturnswitchthrowtrywhile運算符deletefalsenewsizeoftrue其他說明符asmexplicitnamespaceoperatortemplatethistypedeftypenameusingvirtualC++的常用關(guān)鍵字及其分類數(shù)據(jù)類型說明符與修飾符bool2.2const常量符號常量:用一個標(biāo)識符代表的常量,即:在程序中用#define
命令定義某個符號所代表的常量。例如:#defineW”女”#defineM”男”#definePRICE123.789注意:
1.一旦定義了某個符號代表一個常量,則該符號在其作用域內(nèi)就表示這個常量
2.符號常量不是變量,在其作用域內(nèi)不能被賦值
3.為提高程序的可讀性,符號常量一般用大寫表示2.2const常量符號常量:用一個標(biāo)識符代表的常量,即const常量:凍結(jié)變量例:constdoublepi=3.14159265;pi的不能作為lval,pi的值不能被改變C++中使用const常量而不提倡用符號常量。原因:符號常量只是簡單的替代并不做類型檢查,有可能產(chǎn)生類型不匹配的問題。const常量:凍結(jié)變量例:constdoublepiconst定義const定義常量格式如下:const<已知類型><C++合法標(biāo)識>=<初始化對象的表達(dá)式>或:<已知類型>const<C++合法標(biāo)識>=<初始化對象的表達(dá)式> 例如,前面提到的聲明: constdoublePI=3.14; constintbufSize=512; 或:intconstbufSize=512; 數(shù)組常量的定義格式如下: <類型>const<數(shù)組名>[<大小>]={<初值表>}; 或: const<類型><數(shù)組名>[<大小>]={<初值表>}; 例如:
intconstI_ARAAY[3]={1,2,3};constcharNAME[4]={‘J’,’A’,’C’,’K’};const定義const定義常量格式如下: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函數(shù)2.3.1內(nèi)聯(lián)函數(shù)(inline函數(shù))2.3.1內(nèi)聯(lián)函數(shù)(inline函數(shù))1常規(guī)的函數(shù)調(diào)用時間開銷空間開銷2.3.1內(nèi)聯(lián)函數(shù)(inline函數(shù))1常規(guī)的函數(shù)調(diào)用#include<iostream>usingnamespacestd;doublecaclArea(intr);//函數(shù)聲明intmain(){ …… caclArea(1);……caclArea(3);……caclArea(5);……return0;}doublecaclArea(intr){ return3.1416*r*r;}#include<iostream>2內(nèi)聯(lián)函數(shù)的執(zhí)行程序無需跳轉(zhuǎn)對內(nèi)聯(lián)函數(shù)而言,在程序編譯期間,編譯器將使用內(nèi)聯(lián)函數(shù)的函數(shù)體直接替換函數(shù)調(diào)用。因此,內(nèi)聯(lián)函數(shù)的運行速度比常規(guī)函數(shù)稍快。需要占用更多的空間如果程序在10個不同的地方調(diào)用了同一個內(nèi)聯(lián)函數(shù),則程序?qū)摵瘮?shù)的10個代碼拷貝,因此如果函數(shù)代碼長度過大,超出了跳轉(zhuǎn)語句所占空間的長度,就會增加整個程序的代碼量,使程序運行的空間開銷大大增加了內(nèi)聯(lián)的實質(zhì)用空間來換取時間——空間開銷增大了,時間開銷卻減少了,從而提高了程序的執(zhí)行效率。2內(nèi)聯(lián)函數(shù)的執(zhí)行面向?qū)ο蟪绦蛟O(shè)計課件第2章3內(nèi)聯(lián)函數(shù)的定義在函數(shù)聲明前加上關(guān)鍵字inline。在函數(shù)定義前加上關(guān)鍵字inline。如:inlinedoublecaclArea(intr);inlinedoublecaclArea(intr){ return3.1416*r*r;}注:在函數(shù)定義處可用inline關(guān)鍵字說明函數(shù)為內(nèi)聯(lián)函數(shù)。如果函數(shù)定義在函數(shù)調(diào)用之后,則必須在函數(shù)聲明處就包括inline,否則就作為一般的函數(shù)處理。3內(nèi)聯(lián)函數(shù)的定義在函數(shù)聲明前加上關(guān)鍵字inline。
[例2-1]內(nèi)聯(lián)被當(dāng)作一般函數(shù)處理#include<iostream>usingnamespacestd;doubledCaclArea(doubledr);//函數(shù)聲明,此處無inlineintmain(){ inti=5; doubledCirlcle; for(i=1;i<=5;i++) { dCirlcle=dCaclArea(i);//實際沒有內(nèi)聯(lián),仍然調(diào)用
cout<<dCirlcle<<";";}cout<<endl;getchar();return0;}inlinedoubledCaclArea(doubledr)//此處為內(nèi)聯(lián){ return3.1416*dr*dr;}[例2-1]內(nèi)聯(lián)被當(dāng)作一般函數(shù)處理#include<4用內(nèi)聯(lián)函數(shù)替代宏#defineSQUARE(X)X*X這并不是通過傳遞參數(shù)實現(xiàn)的,而是通過文本替換來實現(xiàn)的,看下面的幾個語句:(1)a=SQUARE(4);(2)a=SQUARE(4+5);(3)intb=2;a=SQUARE(b++);(4)a=SQUARE(”hello”);inlinedoubleSQUARE(doublex){returnx*x;}
4用內(nèi)聯(lián)函數(shù)替代宏#defineSQUARE(X)X*5內(nèi)聯(lián)函數(shù)的限制(1)內(nèi)聯(lián)函數(shù)中通常不包括復(fù)雜結(jié)構(gòu)控制語句,如switch、while語句、復(fù)雜語句嵌套,否則,系統(tǒng)將作為一般函數(shù)處理。(2)遞歸函數(shù)不能被作為內(nèi)聯(lián)函數(shù)。(3)內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)。(4)在類結(jié)構(gòu)中,在類體內(nèi)定義的函數(shù)成員都是內(nèi)聯(lián)函數(shù)。5內(nèi)聯(lián)函數(shù)的限制(1)內(nèi)聯(lián)函數(shù)中通常不包括復(fù)雜結(jié)構(gòu)控制語2.3.2重載函數(shù)1.重載函數(shù)引入的原因intiMax(int,int);floatfMax(float,float);doubledMax(double,double);2.3.2重載函數(shù)1.重載函數(shù)引入的原因希望是intMax(int,int);floatMax(float,float);doubleMax(double,double);希望是intMax(int,int);2.重載函數(shù)的匹配在函數(shù)同名的情況下,編譯器是根據(jù)函數(shù)的參數(shù)列表。它是函數(shù)重載的關(guān)鍵。如果兩個函數(shù)的參數(shù)數(shù)目和類型相同,同時參數(shù)的排列順序也相同,則它們的特征標(biāo)相同,如果參數(shù)列表相同僅有函數(shù)返回值類型不同,是不能夠重載的。下面的幾個重載函數(shù)就具有不同參數(shù)列表:intadd(inta,intb);doubleadd(doublea,doubleb);floatadd(folata,folatb)2.重載函數(shù)的匹配在函數(shù)同名的情況下,編譯器重載函數(shù)的匹配當(dāng)某個函數(shù)中調(diào)用重載函數(shù)時,編譯器會根據(jù)實參類型調(diào)用相應(yīng)的函數(shù)。匹配的過程按如下步驟進(jìn)行:如果有嚴(yán)格的匹配的函數(shù),就調(diào)用該函數(shù)。參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,則調(diào)用該函數(shù)。通過用戶定義的轉(zhuǎn)換尋求匹配。例如,如下兩個重載函數(shù):voidfun(int);voidfun(doulbe);對于下列調(diào)用函數(shù)fun()匹配情況如下:fun(2); //匹配voidfun(int),嚴(yán)格匹配fun(2.5); //匹配voidfun(double),嚴(yán)格匹配fun(‘a(chǎn)’); //匹配voidfun(int),內(nèi)部轉(zhuǎn)換后匹配fun((doulbe)6)//匹配voidfun(double),強制類型轉(zhuǎn)換后匹配。重載函數(shù)的匹配當(dāng)某個函數(shù)中調(diào)用重載函數(shù)時,編譯器會根voidfun(long);voidfun(doulbe);intmain(){ inti=5; fun(i);}voidfun(long);使用重載函數(shù)時的注意事項:(1)不能使用類型定義typedef語句定義的類型名來區(qū)分重載函數(shù)中聲明的參數(shù)。例如,下面的函數(shù)重載是不正確的。 typedefintINT; voidfun(int); voidfun(INT)//錯誤!函數(shù)重復(fù)定義(2)重載函數(shù)應(yīng)當(dāng)具有相同或類似的功能,如果讓同名函數(shù)執(zhí)行不同的功能,則程序的可讀性受到破壞,這不是一個良好的編程風(fēng)格。使用重載函數(shù)時的注意事項:(1)不能使用類型定義typede3.重載函數(shù)應(yīng)用舉例[例2-2]求兩個操作數(shù)之和。#include<iostream>usingnamespacestd;intadd(int,int);doubleadd(double,double);intmain(){ cout<<add(5,10)<<endl; cout<<add(5.0,10.5)<<endl; getchar(); return0;}intadd(intx,inty){ returnx+y;}doubleadd(doublea,doubleb){ returna+b;}程序的輸出結(jié)果為:1515.53.重載函數(shù)應(yīng)用舉例[例2-2]求兩個操作數(shù)之和。程序的輸[例2-3]找出幾個int型中的最小值#include<iostream>usingnamespacestd;intmin(inta,intb);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);intmain(){cout<<min(13,5,4,2)<<endl; cout<<min(13,5,4)<<endl;cout<<min(13,5)<<endl;getchar(); return0;}程序的輸出結(jié)果為:245[例2-3]找出幾個int型中的最小值#include<intmin(inta,intb){ returna<b?a:b;}intmin(inta,intb,intc){intt=min(a,b);returnmin(t,c);}intmin(inta,intb,intc,intd){ intt1=min(a,b,c);returnmin(t1,d);}intmin(inta,intb)2.3.3函數(shù)參數(shù)的默認(rèn)值默認(rèn)參數(shù)指的是當(dāng)函數(shù)調(diào)用中省略了實參時,自動使用的一個值。如何設(shè)置默認(rèn)值呢?必須通過函數(shù)的原型。由于編譯器是通過檢查原型來了解函數(shù)所使用的參數(shù)數(shù)目,因此函數(shù)原型必須將可能的默認(rèn)參數(shù)告知程序。方法是將值賦給原型中的參數(shù)。如:intfuntion(intn,intm=4);函數(shù)默認(rèn)參數(shù)聲明的語法格式如下: 返回值類型 函數(shù)名(形參1,…,形參n-1=默認(rèn)值,形參n=默認(rèn)值)2.3.3函數(shù)參數(shù)的默認(rèn)值默認(rèn)參數(shù)指的是當(dāng)函數(shù)調(diào)用注意事項(1)帶有默認(rèn)值的參數(shù)在調(diào)用時,對于默認(rèn)參數(shù),可以給出實參值,也可以不給出實參值。如果給出,則將實參傳遞給形參,否則,將按照形參調(diào)用。注意事項(1)帶有默認(rèn)值的參數(shù)在調(diào)用時,對于默認(rèn)參數(shù),可以給[例2-4]帶默認(rèn)參數(shù)值的函數(shù)#include<iostream>usingnamespacestd;voidfun(inta=1,intb=2,intc=3){ cout<<"a="<<a<<','<<"b="<<b<<',‘ <<"c="<<c<<endl;}intmain(){fun();fun(9);fun(4,5);fun(7,8,9); return0;}程序的輸出結(jié)果為:a=1,b=2,c=3a=9,b=2,c=3a=4,b=5,c=3a=7,b=8,c=9[例2-4]帶默認(rèn)參數(shù)值的函數(shù)#include<iost(2)默認(rèn)參數(shù)并不一定是常量,它可以是任意的表達(dá)式,甚至可以通過函數(shù)調(diào)用給出。如果默認(rèn)參數(shù)是表達(dá)式,則函數(shù)每次調(diào)用時,該表達(dá)式將被重新求值。默認(rèn)值一般是全局變量,而不是局部變量,因為默認(rèn)參數(shù)的調(diào)用是在編譯時去確定的,而局部變量編譯時無法確定。(2)默認(rèn)參數(shù)并不一定是常量,它可以是任意的表達(dá)式,甚至可以[例2-5]帶默認(rèn)參數(shù)值的函數(shù)#include<iostream>usingnamespacestd;intq(5),p(7);intsum_int(inta,intb=p+q,intc=q*p);intmain(){intx(5),y(10);ints1=sum_int(x);ints2=sum_int(x,y);cout<<"s1="<<s1<<'\n'<<"s2="<<s2<<endl; return0;}[例2-5]帶默認(rèn)參數(shù)值的函數(shù)#include<iostintsum_int(inta,intb,intc){returna+b+c;}程序的輸出結(jié)果為:s1=52s1=50intsum_int(inta,intb,intc)(3)對于帶參數(shù)列表的函數(shù),必須從右向左添加默認(rèn)值。也就是說,要為某個參數(shù)設(shè)置默認(rèn)值,則必須為它右邊的所有參數(shù)提供默認(rèn)值,下面的函數(shù)原型說明中,有些是不正確的。intfun(intm,intn=3,intj=5); intfun(intm,intn=3,intj); intfun(intm=1,intn=3,intj=5); (3)對于帶參數(shù)列表的函數(shù),必須從右向左添加默認(rèn)值。也就是說在調(diào)用函數(shù)時,實參按照從左到右的順序依次被賦值給相應(yīng)的形參,而不能跳過任何參數(shù),因此,下面的函數(shù)調(diào)用中,有些也是不允許的。intresults;results=fun(1); results=fun(1,8)results=fun(1,7,8)results=fun(1,,8); 在調(diào)用函數(shù)時,實參按照從左到右的順序依次被賦(4)注意帶有默認(rèn)參數(shù)的重載函數(shù)所引起的二義性。二義性問題實際上就是編譯器不能確定該語句究竟是什么意思,可以作出多種解釋。函數(shù)重載時,尤其在有默認(rèn)參數(shù)的情況下,很容易引發(fā)二義性的問題。intfun(intm,intn,intj=5); intfun(intm,intn=3,intj=5); intfun(intm=1,intn=3,intj=5);fun(1,5)(4)注意帶有默認(rèn)參數(shù)的重載函數(shù)所引起的二義性。二義性問題實2.3.4函數(shù)模板1為什么要使用函數(shù)模板?intadd(inta,intb){ returna+b;}floatadd(floata,floatb){ returna+b;}2.3.4函數(shù)模板1為什么要使用函數(shù)模板?希望Tadd(Ta,Tb){ returna+b;}希望Tadd(Ta,Tb)2函數(shù)模板及其定義函數(shù)模板的一般定義格式如下:template<(模板參數(shù)表)><返回值類型><函數(shù)名>(形式參數(shù)表){ //函數(shù)體}注:模板類型參數(shù)代表一種類型,用關(guān)鍵字typename或class后加一個標(biāo)識符構(gòu)成,在這里,兩個關(guān)鍵字的意義相同,它們表示后面的參數(shù)名代表一個潛在的內(nèi)置或用戶定義的類型。
2函數(shù)模板及其定義函數(shù)模板的一般定義格式如下:注:模板類示例template<typenameAnyType>voidSwap(AnyType&a,AnyType&b){AnyTypetemp;temp=a;a=b;b=temp;}示例template<typenameAnyType>3實例化函數(shù)模板所謂實例化函數(shù)模板,就是編輯器根據(jù)函數(shù)調(diào)用時具體的參數(shù)類型,按照模板樣式,創(chuàng)建具體函數(shù)的過程。在編譯過程中,當(dāng)編譯器發(fā)現(xiàn)有一個函數(shù)調(diào)用<函數(shù)名>(<實參表>)時,它將根據(jù)<實參表>中的具體類型實參生成一個重載函數(shù)即模板函數(shù)。該模板函數(shù)的定義體與函數(shù)模板的定義體相同,而<型參表>類型則以<實參表>類型來代替。3實例化函數(shù)模板所謂實例化函數(shù)模板,就是編[例2-6]交換兩個數(shù)的函數(shù)模版#include<iostream>//函數(shù)模板原型template<typenameAnyType>//或者是tempplate<classAnyType>voidSwap(AnyType&a,AnyType&b);intmain(){usingnamespacestd;inti=10;intj=20;cout<<"i,j="<<i<<","<<j<<"\n";cout<<"Usingcompilergenerateintswapper:\n";Swap(i,j);//生成函數(shù)VoidSwap(int&,int&)cout<<"Nowi,j="<<i<<","<<j<<"\n";doublex=2.45;doubley=8.17;cout<<"x,y="<<x<<","<<y<<"\n";cout<<"Usingcompilergeneratedoubleswapper:\n";Swap(x,y);//生成函數(shù)VoidSwap(double&,double&)cout<<"Nowx,y="<<x<<","<<y<<".\n";getchar();return0;}[例2-6]交換兩個數(shù)的函數(shù)模版#include<io//函數(shù)模板定義template<typenameAnyType>//或者是tempplate<classAnyType>voidSwap(AnyType&a,AnyType&b){AnyTypetemp;//temp是一個AnyType類型的變量
temp=a;a=b;b=temp;}//函數(shù)模板定義4函數(shù)模板與模板函數(shù)函數(shù)模板與模板函數(shù)的主要區(qū)別在于:(1)函數(shù)模板不是一個函數(shù),而是對一組函數(shù)的描述,是一組函數(shù)的模板,在定義時使用了參數(shù)化類型。(2)模板函數(shù)是一種實實在在的函數(shù)定義,它的函數(shù)體與某個函數(shù)模板的函數(shù)體相同,編譯器遇到模板函數(shù)調(diào)用時,將生成可執(zhí)行代碼。4函數(shù)模板與模板函數(shù)函數(shù)模板與模板函數(shù)的主要區(qū)別在于:5重載函數(shù)模板函數(shù)模板與普通函數(shù)一樣,也可以重載。這里包含兩種含義,第一種是可以像重載常規(guī)函數(shù)定義那樣重載模板定義,另一種重載常規(guī)函數(shù)定義。下面我們分別通過舉例來說明這兩種重載函數(shù)模板的情形。5重載函數(shù)模板函數(shù)模板與普通函數(shù)一樣,也可以重載。這里包含(1)重載函數(shù)模板定義[例2-7]重載函數(shù)模板定義——兩個Swap函數(shù)模板重載#include<iostream>template<typenameAnyType>//原來定義的模板voidSwap(AnyType&a,AnyType&b);template<typenameAnyType>//新定義的模板voidSwap(AnyType*a,AnyTyp
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藍(lán)色幾何形狀多邊形背景微立體年中工作總結(jié)匯報
- 2025年宋慶齡幼兒園工作人員公開招聘備考題庫及完整答案詳解一套
- 2025年國有企業(yè)招聘工作人員備考題庫及一套參考答案詳解
- 2026年春學(xué)期語言中心課程助教招聘備考題庫及答案詳解參考
- 2025年大唐(內(nèi)蒙古)能源開發(fā)有限公司招聘若干人(錫盟)備考題庫及一套答案詳解
- 2025年吉林大學(xué)材料科學(xué)與工程學(xué)院人才派遣(Ⅱ類)人員招聘備考題庫完整參考答案詳解
- 家電維修空調(diào)故障試卷及答案
- 2025年浙江工商大學(xué)杭州商學(xué)院公開招聘教學(xué)科研管理崗(教學(xué)秘書)備考題庫及參考答案詳解1套
- 洛陽市青少年體育訓(xùn)練中心2025年引進(jìn)緊缺人才工作實施備考題庫參考答案詳解
- 2025年上海戲劇學(xué)院公開招聘工作人員23人備考題庫及參考答案詳解一套
- 2024-2025學(xué)年廣東省廣州市越秀區(qū)八年級上學(xué)期期末考試物理試卷(含答案)
- AI與智慧圖書館雙向賦能
- 《中藥的現(xiàn)代化》課件
- 生物專業(yè)英語翻譯-蔣悟生
- 高速鐵路客運規(guī)章(第2版)課件 項目五 高速鐵路旅客運輸服務(wù)管理
- 基礎(chǔ)醫(yī)學(xué)概論期末考試試卷
- 自愿離婚協(xié)議書標(biāo)準(zhǔn)樣本(八篇)
- 食品營養(yǎng)學(xué)(暨南大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年暨南大學(xué)
- 重慶市兩江新區(qū)2022-2023學(xué)年五年級下學(xué)期期末數(shù)學(xué)試題
- 閨蜜測試卷試題
- 基于DSP的搶答器的設(shè)計與開發(fā)
評論
0/150
提交評論