第8章 異常,模板_第1頁(yè)
第8章 異常,模板_第2頁(yè)
第8章 異常,模板_第3頁(yè)
第8章 異常,模板_第4頁(yè)
第8章 異常,模板_第5頁(yè)
已閱讀5頁(yè),還剩50頁(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第8章 異常(exception),

模板(template)

2主要內(nèi)容異常模板函數(shù)模板類(lèi)模板命名空間31.

異常(exception)4C++中錯(cuò)誤被稱(chēng)為異?;蚶猓‥xception)。異常是運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤,是由大量的例外情況產(chǎn)生的,例如內(nèi)存用盡,不能打開(kāi)文件,使用不合適的值初始化對(duì)象…51.1 異常的引入C語(yǔ)言處理錯(cuò)誤時(shí),通常返回一個(gè)特殊的值,用此值來(lái)表示函數(shù)產(chǎn)生了一個(gè)錯(cuò)誤。例如:

if(somefunc()==ERROR_RETURN_VALUE) //handletheerrororcallerror-handlerfunction else //proceednormally if(anotherfunc()==NULL) //handletheerrororcallerror-handlerfunction else //proceednormally if(thirdfunc()==0) //handletheerrororcallerror-handlerfunction else //proceednormally

6這種處理的問(wèn)題是:每調(diào)用一次函數(shù),程序就必須檢查一遍返回值,代碼量增多。當(dāng)在程序中使用類(lèi)庫(kù)時(shí),這個(gè)問(wèn)題變得更加復(fù)雜。使得錯(cuò)誤檢測(cè)更加不容易。71.2 異常的語(yǔ)法C++使用try、throw和catch語(yǔ)句實(shí)現(xiàn)異常處理。當(dāng)預(yù)測(cè)到某段程序?qū)⒖赡艹霈F(xiàn)問(wèn)題時(shí),則將該段程序放在try語(yǔ)句之后,使該段程序得以有機(jī)會(huì)拋出異常。8在程序的某個(gè)函數(shù)中發(fā)現(xiàn)異常時(shí)使用throw表達(dá)式拋出這個(gè)異常,這個(gè)異常被拋給該函數(shù)的調(diào)用者。調(diào)用者用catch捕捉該異常并進(jìn)行相應(yīng)的處理。9C++庫(kù)中的一些庫(kù)函數(shù)已經(jīng)設(shè)計(jì)了異常拋出。也就是系統(tǒng)會(huì)自動(dòng)throw一些定義好的異常,以便C++程序里可以catch它們,并進(jìn)行處理。例:badalloc.cpp10程序里自定義異常,并進(jìn)行處理方法:#include<iostream.h>classBall{ intradius;public: Ball(intrad);voidprint()const{cout<<radius<<endl;}};11Ball::Ball(intrad){radius=rad;if(radius==0)throwrad;//如果有錯(cuò)誤,使用 throw拋出一個(gè)標(biāo)識(shí)

}12

intmain(){try//把可能出現(xiàn)異常的程序放在try復(fù)合語(yǔ)句中

{Ballmyball(1);Ballyourball(0);//exception}catch(int){//對(duì)應(yīng)異常標(biāo)識(shí),給出相應(yīng)處理方法

cout<<"exception:invalidradius,radiusmustbegreatthan0"<<endl;}return0;}13C++語(yǔ)言提供對(duì)處理異常情況的內(nèi)部支持。

try{//try關(guān)鍵字引導(dǎo)的try塊

……//可能引發(fā)錯(cuò)誤的程序段

……throwlabel1//異常標(biāo)識(shí)

……throwlabel2//異常標(biāo)識(shí)}//結(jié)束try塊14

catch(異常類(lèi)型聲明1)//catch塊與label的類(lèi)型匹配

{

……//處理響應(yīng)異常

}

catch(異常類(lèi)型聲明2)//catch塊與label的類(lèi)型匹配{

……//處理響應(yīng)異常}15拋擲異常與異常處理程序之間,是按數(shù)據(jù)類(lèi)型的嚴(yán)格匹配來(lái)捕獲的。下面是幾個(gè)throw和catch對(duì)應(yīng)的例子:“throw1;”和“throwi;”被catch(inti)

捕獲“throwdnum”被catch(doublednum)

捕獲“throw"abc";”被catch(char*ptr)

捕獲“throwstring("abc");”被catch(stringstr)

捕獲“throwpoint(1.2,5.8);”被catch(pointa)

捕獲16演示異常的例子。#include<iostream>usingnamespacestd;doubleDiv(doublex,doubley);voidmain(){boolflag=true; try { cout<<Div(15.5,5.5)<<endl; 17cout<<Div(8.25,8.25)<<endl;cout<<Div(70,3.3)<<endl;}//endoftry catch(double) { cout<<"exceptofdevidingzero.\n"; flag=false; } if(flag==false)cout<<"Thereisanymistake."<<endl; elsecout<<"Thatisok.\n"; cout<<"Exit..."<<endl;}18doubleDiv(doublex,doubley){ doubletemp; temp=x,x=x+y,y=temp-y;if(y==0) throwy; returnx/y;}19程序在處理異常之后,繼續(xù)執(zhí)行catch后面的if語(yǔ)句,直到結(jié)束。輸出結(jié)果如下:1.2963exceptofdevidingzero.Thereisanymistake.Exit...202.函數(shù)模板(FunctionTemplate)21模板的作用:一個(gè)函數(shù)或者類(lèi)去處理不同的數(shù)據(jù)類(lèi)型。使用模板可以使用戶(hù)為類(lèi)或者函數(shù)聲明一種通用模式,使得類(lèi)中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類(lèi)型。模板概述222.1函數(shù)模板的引入假如編寫(xiě)一個(gè)函數(shù),返回?cái)?shù)的絕對(duì)值。對(duì)于int數(shù)據(jù)類(lèi)型,此函數(shù)可寫(xiě)為:

intabs(intn){ return(n<0)?–n:n; }對(duì)于long數(shù)據(jù)類(lèi)型,此函數(shù)可寫(xiě)為:

longabs(longn){ return(n<0)?–n:n; }對(duì)于float數(shù)據(jù)類(lèi)型,此函數(shù)可寫(xiě)為:

floatabs(floatn){ return(n<0)?–n:n; }23上面每個(gè)函數(shù)中,函數(shù)體都是一樣,只是參數(shù)類(lèi)型和返回值類(lèi)型不一樣。如果只把這個(gè)函數(shù)寫(xiě)一遍,而讓其處理不同的數(shù)據(jù)類(lèi)型,這正是函數(shù)模板所實(shí)現(xiàn)的。24函數(shù)模板就是一系列相似函數(shù)的模型。這些函數(shù)的代碼形式相同,只是所針對(duì)的參數(shù)和返回值的數(shù)據(jù)類(lèi)型不同。25template<classT>Tfunc(Targ){…}一個(gè)函數(shù)模板intfunc(intarg){…}charfunc(chararg){…}floatfunc(floatarg){…}i1=func(i2);c1=func(c2);f1=func(f2);參數(shù)類(lèi)型決定函數(shù)實(shí)例化262.2 函數(shù)模板的定義欲定義一函數(shù)為template函數(shù),其格式如下:

template<classType>

//template定義部分Typefuncname(Type,Type…){}

//真正函數(shù)定義部分

關(guān)鍵字?jǐn)?shù)據(jù)類(lèi)型函數(shù)的參數(shù)行27見(jiàn)例:tempabs.cpp在程序中定義了可以處理多種數(shù)據(jù)類(lèi)型的函數(shù)abs(): template<classT> Tabs(Tn) { return(n<0)?–n:n; }28函數(shù)模板定義的創(chuàng)新之處在于:函數(shù)所使用的參數(shù),返回值用一個(gè)通用名字如Type(anyType,T…)替代了int,long,float

等特定的類(lèi)型。29程序tempabs.cpp中,

cout<<“\nabs(”<<int<<“)=”<<abs(int1);當(dāng)調(diào)用到函數(shù)abs(int1)時(shí),編譯器才知道所用類(lèi)型是int,因而用int代替abs模板中的所有T,這就是函數(shù)模板的實(shí)例化。

30函數(shù)模板并不是真正的函數(shù),只是一種產(chǎn)生多種函數(shù)的模式或者框架,并不使程序代碼占用內(nèi)存。312.3 多參數(shù)函數(shù)模板見(jiàn)例:tempfind.cpp此函數(shù)模板有三個(gè)參數(shù),兩個(gè)是模板參數(shù),一個(gè)是基本類(lèi)型。此函數(shù)模板的作用是從數(shù)組中尋找特定的值,如果找到這個(gè)值,就返回所在位置,如果沒(méi)有找到,則返回-1。參數(shù)分別為指向數(shù)組的指針,要找的特定值和數(shù)組大小。32332.4 多種類(lèi)型模板參數(shù)在模板函數(shù)中可以使用多種類(lèi)型模板參數(shù)。其函數(shù)定義的格式如下:

template<classType1,classType2> Type1fun(Type1a,Type2b){…}Type1,Type2為不同數(shù)據(jù)類(lèi)型,返回值可以為T(mén)ype1,Type2或其他基本類(lèi)型。34注意:在定義類(lèi)型參數(shù)時(shí),每一類(lèi)型參數(shù)都必須跟著一個(gè)關(guān)鍵字class,以下的格式是錯(cuò)誤的:

Template<classType1,Type2>

//error!!而對(duì)于函數(shù)參數(shù)表中,每一個(gè)已定義的類(lèi)型參數(shù)都必須至少被使用一次。以下的格式是錯(cuò)誤的:

template<classT1,classT2,classT3> T3fun(T1a,T1b,T2c){..}

//error!!35修改程序tempfind.cpp,定義數(shù)組大小的類(lèi)型名為btype:

template<classatype,classbtype> btypefind(atype*arrary,atypevalue,btypesize) { for(btypej=0;j<size;j++) { if(arrary[j]==value) returnj; return-1; }這樣就可以使用int或者long類(lèi)型作為數(shù)組大小。363. 類(lèi)模板37模板的概念可以擴(kuò)展到類(lèi)。用一種類(lèi)似函數(shù)模板的機(jī)制來(lái)解決類(lèi)數(shù)據(jù)成員更改的問(wèn)題——類(lèi)模板。3.1 類(lèi)模板的引入38例如:如下的stack類(lèi)僅能存儲(chǔ)int類(lèi)型

classStack{ private: intst[MAX];//arrayofints inttop;//indexnumberoftopofstack

public: Stack(); voidpush(intvar);//takesintasarg.

intpop();//returnsintvalue };39如果想在棧中存儲(chǔ)long類(lèi),則需要重新定義類(lèi):

classLongStack{ private: longst[MAX];//arrayoflongs inttop;//indexnumberoftopofstack

public: LongStack(); voidpush(longvar);//takeslongasarg.

longpop();//returnslongvalue };40如此一來(lái),就需要為存儲(chǔ)的每種數(shù)據(jù)類(lèi)型定義新的Stack類(lèi)。如使用類(lèi)模板就方便得多。類(lèi)模板的格式如下:

template<classType> classStack { //dataandmemberfunctionsusingargumenttype };3.2 類(lèi)模板的定義41見(jiàn)例:tempstack.cpp此例中,模板參數(shù)是Type,此參數(shù)出現(xiàn)在類(lèi)定義中涉及到數(shù)組st類(lèi)型的所有地方。與函數(shù)模板相同,類(lèi)模板只有使用的時(shí)候才被具體化為某一種類(lèi)型。42類(lèi)模板和函數(shù)模板的不同之處在于:函數(shù)模板的使用是由編譯器自動(dòng)決定的;而類(lèi)模板定義對(duì)象時(shí)其真正類(lèi)型必須由程序設(shè)計(jì)者自己指明。43例如:

Stack<float>s1;

此語(yǔ)句創(chuàng)建了對(duì)象s1,為s1的數(shù)據(jù)在內(nèi)存中提供了空間;用float代替類(lèi)定義中所有模板參數(shù),同時(shí)也為成員函數(shù)提供內(nèi)存空間。 如果創(chuàng)建其他類(lèi)型的堆棧,如:

Stak<long>s2;

則為數(shù)據(jù)創(chuàng)建了不同的內(nèi)存空間。44template<classT>classAclass{//statements….};源代碼中的一個(gè)類(lèi)模板obj1storesfloatsobj2storeintsobj3storeintsobj4storescharsobj5storescharsAclass<float>obj1;Aclass<int>obj3;Aclass<int>obj2;Aclass<char>obj5;Aclass<char>obj4;內(nèi)存中不同類(lèi)的多個(gè)對(duì)象453. 命名空間46為什么需要命名空間?命名空間是C++中的一個(gè)不常用的概念。C++中采用的是單一的全局變量命名空間。在這單一的空間中,如果有兩個(gè)變量或函數(shù)的名字完全相同,就會(huì)出現(xiàn)沖突。47stringnamestringnamenamespacemynamespaceyour48命名空間定義名字空間的定義與一個(gè)類(lèi)的定義非常相似:

namespaceMyLib{ //Declarations }在namespace定義的結(jié)尾,不必要跟一個(gè)分號(hào)。49namespace與class、structure、union和enum有著明顯的區(qū)別:

1)namespace只能在全局范疇定義,但它 們之間可以互相嵌套。

2)一個(gè)namespace可以在多個(gè)頭文件中。

3)不能像類(lèi)那樣去創(chuàng)建一個(gè)命名空間的實(shí)例。50使用命名空間

1.域名 命名空間中的任何命名都可以用域名明確指定,就像引用一個(gè)類(lèi)名一樣。51//兩個(gè)在不同命名空間中定義的名字相同的變量namespacemyown1{

stringuser_name="myown1";}namespacemyown2{

stringuser_name="myown2";}52intmain(){

cou

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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)論