




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第13章模板與異常處理楊琦西安交通大學
計算機教學實驗中心
本章目標掌握函數模板概念和使用掌握類模板概念和使用了解異常處理機制授課內容13.1模板13.2異常處理機制13.3友元13.1模板函數模板template<<模板參數表>><類型><函數名>(<參數表>) { … }類模板template<class<類型參數>>class<類名>{……};例13.1定義求兩個數據最大值的函數模板#include<iostream>#include<string>usingnamespacestd;template<classT>TMax(Ta,Tb){returna>b?a:b;}intmain(){inti1=3,i2=5;doubled1=3.3,d2=5.2;stringstr1("xjtu"),str2("xian");cout<<"Typeint:"<<Max(i1,i2)<<endl;cout<<"Typedouble:"<<Max(d1,d2)<<endl;cout<<"Typestring:"<<Max(str1,str2)<<endl;return0;}函數模板的幾點本卷須知〔1〕在函數模板的參數表中,至少有一個參數的類型為模板的類型參數。另外,函數的返回值的類型也可以是該類型參數。〔2〕模板中可以帶有多個參數類型。例如:template<classT1,classT2,classT3>voidfunc1(T1arg1,T2arg2,T3arg3){…}〔3〕函數模板參數表中可以帶有未給出的、已存在的數據類型。例如:template<classT> Tfunc2(Targ1,intarg2){…}函數模板的引入例:分別在n個元素的整型和實型數組中找出最大值。算法:動態分配數組空間分別用兩個函數求int和float型數組的最大和最小值。特征:函數代碼相似,僅數據類型不同在C++中,把代碼相同,僅數據類型不同的多個函數,可以抽象用一個函數通過設置“類型”參數實現其功能。該函數為模板函數。#include<iostream.h>template<classT>Tmaxval(T*pa,intn){Tmax=*pa;for(intk=1;k<n;k++)if(pa[k]>max)max=pa[k];returnmax;}intmain(){int*p1,n;float*p2;cout<<“輸入數據個數:”;cin>>n;p1=newint[n];if(p1==NULL)return1;cout<<“輸入”<<n<<“個整數:”<<endl;for(intk=0;k<n;k++)cin>>p1[k];cout<<“最大:”<<maxval(p1,n)<<endl;p2=newfloat[n];if(p2==NULL)return2;cout<<“輸入”<<n<<“個實型數:”<<endl;for(intk=0;k<n;k++)cin>>p2[k];cout<<“最大:”<<maxval(p2,n)<<endl;return0;}13.1.2類模板類是對問題空間的抽象,而類模板那么是對類的抽象,即更高層次上的抽象。與函數模板相似,程序中可以通過高度抽象首先定義一個類模板,然后通過使用不同的實參生成不同的類。類模板的定義方法為:template<class<類型參數>>class<類名>{……};例13.2定義一個通用的棧類654321棧中最大數目m_nMaxElement棧中數據數目m_nTopboolPush(T);boolPop(T&);整型、字符型例13.2定義一個通用的棧類template<classT,intn=10>classAnyStack{ T m_tStack[n];int m_nMaxElement;int m_nTop;public:AnyStack():m_nMaxElement(n),m_nTop(0){}intGetTop(){returnm_nTop;}boolPush(T);//入棧函數boolPop(T&);//出棧函數};template<classT,intn>boolAnyStack<T,n>::Push(Telem){if(m_nTop<=m_nMaxElement){m_tStack[m_nTop]=elem;m_nTop++;returntrue;}else returnfalse;}template<classT,intn>boolAnyStack<T,n>::Pop(T&elem){ if(m_nTop>0) { m_nTop--; elem=m_tStack[m_nTop]; returntrue; } else returnfalse;}例13.2定義一個通用的棧類intmain(){intn;strings1;AnyStack<int>iStack;//定義一個整數棧iStack.Push(5);iStack.Push(6);iStack.Pop(n);cout<<"第一個出棧整數="<<n<<endl;iStack.Pop(n);cout<<"第二個出棧整數="<<n<<endl;AnyStack<string>strStack;//定義一個字符串棧strStack.Push("It'sfirststring");strStack.Push("It'ssecondstring");strStack.Pop(s1);cout<<"第一個出棧字符串="<<s1<<endl;strStack.Pop(s1);cout<<"第一個出棧字符串="<<s1<<endl;return0;}13.2異常處理機制C++的異常處理使程序可以向更高的層次傳遞意想不到的事件,從而使程序能更好地從這些異常事件中恢復過來。下面具體介紹異常處理的語法。1.異常處理的語法①throw表達式用來檢測是否產生異常,假設是,那么拋擲異常。語法如下:throw表達式;②try是一個復合語句塊,它將那些有可能產生異常的語句框定在try塊中,并根據異常的情況使用不同的throw表達式拋出異常。語法如下:13.2異常處理機制try{//復合語句……throw表達式1;……throw表達式2;……throw表達式n;}③緊接try塊,使用catch塊,將異常處理的語句放在catch塊中,以便異常被傳遞過來時就處理它。每個catch塊是一個復合語句,處理相應的異常。語法如下:13.2異常處理機制catch(異常類型說明1){......//復合語句}catch(異常類型說明2){......//復合語句}……catch(異常類型說明n){......//復合語句}如果某程序中發現了自己不能處理的異常,就可以使用throw表達式拋擲這個異常,將它拋擲給調用者。throw的操作數在表示異常類型語法上與return語句的操作數相似。13.2異常處理機制try塊中的復合語句是代碼的保護段。如果預料某段程序代碼〔或對某個函數的調用〕有可能發生異常,就將它放在try塊中。如果這段代碼〔或被調用的函數〕運行時真的遇到異常的情況,其中的throw表達式就會拋擲這個異常。緊接try塊的catch塊復合語句是異常處理程序,“捕獲”由throw表達式拋擲的異常。13.2異常處理機制2.異常處理的執行過程①控制通過正常的順序執行到達try語句,然后執行try塊的保護段。②如在保護段執行期間沒有引起異常,就跳過try塊后的所有catch塊,繼續執行緊接最后一個catch塊后面的程序。例13.3異常處理機制的使用#include<iostream.h>voidtestfun(inttest){ try{ if(test)throwtest; elsethrow"itisazero";} catch(inti) {cout<<"Exceptoccurred:"<<i<<endl;} catch(constchar*s) {cout<<"Exceptoccurred:"<<s<<endl;}}intmain(){testfun(100);testfun(0);return0;}異常規格說明異常規格說明存在于函數說明中,位于參數列表之后。函數的所有潛在異常類型均隨著關鍵字throw而插入函數說明中。如:voidSetElem(inti,intj,doubleval)throw(InvalidIndex);而傳統的函數聲明,如:voidSetElem(inti,intj,doubleval);可能拋出任何一種異常。而voidf(inti,floatj,doubleval)throw();不能拋出任何一種異常。好的編程習慣:對于每一個有異常拋出的函數都應當參加異常規格說明。自學內容友元:允許類外部的函數或者類具有該類私有成員的特權。友元函數友元類13.3友元函數一個類的友元函數是在該類中說明的、用關鍵字friend修飾的函數,該函數有權訪問類中所有的成員。說明一個友元的一般形式為friend<類型><函數名>(<參數表>);例如:classPerson{ ......public:friendvoidFriFunc(Person&person);......};voidFriFunc(Person&person){ ......}一個類的友元可以是類外的任何函數,包括不屬于任何類的函數和屬于某個類的成員函數。13.3友元類當一個類成為另一個類的友元時,就構成了友元類。這意味著該類的每一個成員函數都是另一個類的友元函數。如:classPerson{......public:friendclassGovernment;......};程序設計舉例[例13-4]定義一個求冪函數的函數模板。[例13-5]用函數模板實現順序查找算法。[例13-6] 定義一個通用的棧類并測試。[例13-7]除0異常。[例13-8]求一元二次方程ax2+bx+c=0的根,其中系數a,b,c為實數,由鍵盤輸入。要求使用異常機制。例13-4定義一個求冪函數的函數模板#include<iostream.h>template<classT>TPower(Ta,intexp){ Tans=a; while(--exp>0)ans*=a; returnans;}intmain(){ cout<<"3^5="<<Power(3,5)<<endl; cout<<"1.1^2="<<Power(1.1,2)<<endl; return0;}例13-5用函數模板實現順序查找算法#include<iostream.h>template<classT>intsequentialsearch(Ta[],constT&k,intn){ inti=0; while(k!=a[i]&&i<=n-1) i++; if(i>n-1)i=-1; returni;}intmain()//測試用主函數{ inti1[]={3,2,5,0,-1,7}; doubled1[]={3.3,2.1,0.3,1.5,10.6,5.2}; char*c1="xjtu"; cout<<sequentialsearch(i1,15,6)<<endl; cout<<sequentialsearch(d1,3.3,5)<<endl; cout<<sequentialsearch(c1,'j',4)<<endl; return0;}例13-7:除數為0時的異常intmain(){doublen1,n2,result;cout<<"Inputtwonumber:”;while(cin>>n1>>n2){try{result=Div(n1,n2);cout<<n1<<"/"<<n2<<"="<<result<<endl;} catch(double){cout<<“產生異常:0作除數"<<endl;}cout<<"Inputtwonumber:”;}cout<<"Thatisok."<<endl;return0;}doubleDiv(doublea,doubleb){ if(b==0.0) throwb; returna/b;}[例13-8]求一元二次方程的根#include<iostream.h>#include<math.h>voidRoot(doublea,doubleb,doublec){ doublex1,x2,delta; delta=b*b-4*a*c; if(a==0)throw"dividebyzero"; if(delta<0)throw0; x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); cout<<"x1="<<x1<<endl<<"x2="<<x2<<endl;}intmain(){doublea,b,c;cout<<"pleaseintputa,b,c=?";cin>>a>>b>>c;try{Root(a,b,c); }catch(char*){cout<<"itisnotaquadraticequation."<<endl;}catch(int){cout<<"therealrootofthisequationdoesnotexist."<<endl;}return0;}實例編程---矩陣類實現一個實數矩陣類:可以進行加、減、乘和賦值運算,并且要重載運算符“〔〕”,用來返回矩陣元素的值。同時,該類還要支持異常處理機制,能夠處理可能的非法矩陣操作。算法一個Matrix對象是具有row和col列double型元素,將它們以行順序存放在elems中。兩個矩陣可以相乘的前提條件是前一個矩陣的列數等于后一個矩陣的行數,具體算法見例4-4。矩陣的加減和賦值運算是每個對應元素的加減和賦值運算,所以進行該類運算的矩陣必須維數相同。小結C++中提供了兩種模板類型:函數模板、類模板。函數模板的定義方法為:template<class<類型參數>><類型><函數名>(<參數表>) { … }類模板的定義方法為template<class
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《結腸息肉護理與預防》課件
- 《蘭州財經大學法學院》課件
- 《房地產經紀實務與應用課件》
- 譚小芳領導干部學習能力提升培訓
- 2025年武漢貨運從業資格證考試模擬考試題及答案大全
- 上海市松江區統考2025屆高三下學期第一次統一考試語文試題試卷含解析
- 柳州鐵道職業技術學院《觀賞植物病理學》2023-2024學年第一學期期末試卷
- 文山壯族苗族自治州2025年數學三下期末聯考模擬試題含解析
- 獅子山區2024-2025學年數學五下期末質量跟蹤監視試題含答案
- 武漢海事職業學院《中國古代小說研究》2023-2024學年第二學期期末試卷
- 滬科版八年級物理全冊《8 復習:大氣壓強、流體壓強》教案
- 中醫治療盆腔炎
- DB32T 4878-2024居住區供配電設施建設標準
- BRC內部審核檢查表(BRC內審檢查表)
- 古建筑修繕施工質量控制方案
- DB21T 2481-2015 水利工程單元工程施工質量檢驗與評定標準-農村水利工程
- 專題03全等模型-手拉手模型(原卷版+解析)
- 售后文員的工作職責模版(2篇)
- 沿街商鋪、合用場所消防安全培訓課件
- 靜脈炎的預防及處理-李媛
- 2024旋翼無人機巡檢作業規范
評論
0/150
提交評論