




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、模板及其它內(nèi)容第06章主要內(nèi)容6.2 類模板6.4 標準模板庫簡介6.3 異常處理6.1 函數(shù)模板1、為什么要函數(shù)模板?問題:多個函數(shù)的參數(shù)個數(shù)相同,處理代碼相同,但處理的數(shù)據(jù)類型不同。函數(shù)重載,可以保證函數(shù)名相同,但代碼冗余,存在多個雷同的實現(xiàn),維護的代價高。模板技術:將函數(shù)參數(shù)類型提取出來作為“類型參數(shù)”,通過創(chuàng)建通用的函數(shù)模板,避免函數(shù)體的重復定義。函數(shù)模板與模板函數(shù)在編譯階段,根據(jù)函數(shù)調(diào)用時實參的類型,產(chǎn)生實際的函數(shù)體代碼,并進行類型檢查函數(shù)模板:通用的函數(shù)模板,支持類型參數(shù)化,是產(chǎn)生實際函數(shù)代碼的模板。模板函數(shù):調(diào)用函數(shù)時根據(jù)實參的類型,編譯器生成函數(shù)實例并對其進行編譯2、求不同類型
2、數(shù)據(jù)的最大值使用函數(shù)重載int max(int a,int b)return ab?b:a;foat max1(float a, float b)char max2(char a, char b)求不同類型數(shù)據(jù)的最大值使用模板技術#include template T & max(T const& a, T const& b)return ab?b:a;/模板定義了一個返回兩個值中最大者,兩個值通過a和b傳遞,而參數(shù)類型還沒確定,用模板參數(shù)T來代替。main void main()coutmax(3,6)endl;char c1=a;char c2=b;coutmax(c1,c2)endl;
3、/編譯后,實際有兩個版本的max函數(shù)輸出結(jié)果6b編譯后的效果int max(int const& a, int const& b)return ab?b:a;char max(char const& a, char const& b)return ab?b:a;3、模板參數(shù)的類型演繹template T const& max(T const& a, T const& b) return ab?b:a; max(4,7);編譯器能夠推斷所有的T均為int型max(4,4.2); /語法錯誤,T的類型?解決方法(1)template T const& max(T const& a, T const
4、& b) return ab?b:a; max(4,4.2); /直接指定T的類型為double解決方法(2)template T1 const& max(T1 const& a, T2 const& b) return ab?b:a; max (4,4.2); /OK/返回值類型與第一個參數(shù)一致,為int型4、參數(shù)的省略(1)根據(jù)調(diào)用實參類型,可以確定模板參數(shù)時,不必顯示指定。template T const& max(T const& a,T const& b);coutmax(3,4);也可以顯示指定coutmax(3,5);參數(shù)的省略(2)當返回值類型與參數(shù)類型不同時,必須顯示指定返回
5、值模板參數(shù)類型。template RT const& max(T1 const& a,T2 const& b);coutmax(3,4.2); /error,無法確定RT類型coutmax(3,4.2); /RT類型為int,T1類型為int,T2類型為int省略形式max(3,4.2); /RT為int型,T1為int,T2為double5、函數(shù)模板中含普通參數(shù)求數(shù)組元素的和的函數(shù)模板。#include template T Sum( T *array, int size)T total=0;for(int i=0;isize;i+)total+=arrayi;return total;主要
6、內(nèi)容6.2 類模板6.4 標準模板庫簡介6.3 異常處理6.1 函數(shù)模板類模板定義 template class Exam T elems; public: void SetT (T const&); T GetT() const; void output(); /模板定義類模板類體實現(xiàn) template void Exam :SetT(const T& e)elems=e;template T Exam:GetT() constreturn elems;main void main()Exam e1;e1.SetT(5);coute1.GetT()endl; Exam e2;e2.Set(5
7、.5);coute2.GetT()endl;輸出結(jié)果55.5實際產(chǎn)生兩個類的定義及實現(xiàn)等效的類定義(1) class Exam int elems; public: void SetT (int const&); int GetT() const; void output(); /模板定義void Exam : SetT(const int& e)elems=e; int Exam : GetT() constreturn elems; 等效的類定義(2) class Exam double elems; public: void SetT (double const&); double Ge
8、tT() const; void output(); /模板定義void Exam : SetT(const double& e)elems=e; double Exam : GetT() constreturn elems; 主要內(nèi)容6.2 類模板6.4 標準模板庫簡介6.3 異常處理6.1 函數(shù)模板1、異常和錯誤的概念我們在編寫軟件時,不僅要保證軟件的正確性,還要使軟件具有容錯能力。程序運行時有的錯誤是可以預料但不可避免的,如內(nèi)存空間不足、硬盤上的文件被移動、打印機未連接好等,程序要力爭做到允許用戶排除環(huán)境錯誤,繼續(xù)運行程序,這些就是異常處理的任務。在大型軟件開發(fā)中,函數(shù)模塊眾多,發(fā)現(xiàn)錯誤
9、的函數(shù)往往不具備處理錯誤的能力,通常會引發(fā)一個異常,C+允許將異常向上級調(diào)用者傳遞,允許異常發(fā)現(xiàn)和處理位于不同層次上。異常傳遞思想函數(shù)f( )捕獲并處理異常函數(shù)h( ) 引發(fā)異常函數(shù)g( )調(diào)用者異常傳播方向調(diào)用關系2、C+異常機制C+使用try、throw、catch語句實現(xiàn)異常機制。通常創(chuàng)建try塊包圍有可能出問題的代碼區(qū)try SomeDangerousfunction(); catch塊通常位于try塊之后,對不同的異常進行處理拋出除0異常int Div(int x,int y)if(y=0)throw y; /拋出一個對象或數(shù)值return x/y;處理除0異常void main()
10、trycoutDiv(5,2)endl;coutDiv(8,0)endl;coutDiv(7,1)endl;catch(int) /catch匹配異常類型coutexcept of deviding zero.n;coutthat is ok.n;3、定義異常類class CExceptionCException()CException()void showReson() cout“CException異常基類n”; ;異常派生類class popOnEmpty:public CExceptionvoid showReson() cout “堆棧已空”endl; ;class pushOnFu
11、ll:public CExceptionvoid showReson() cout“堆棧已滿”endl; ;堆棧的定義template class Stack T pData100;int top;public:Stack(); void push(const T &item);T pop();bool isEmpty();bool isFull();堆棧的實現(xiàn)template Stack:Stack() top=-1; /top指向棧底template bool Stack:isEmpty() return top=-1; template bool Stack:isFull() retur
12、n top=99; 堆棧的實現(xiàn)template void Stack:push(const T& item) if(isFull() throw pushOnFull();top+;pDatatop=item;template T Stack:pop()if(isEmpty()throw popOnEmpty();return pDatatop-;主程序void main()int i;Stack s;tryfor(i=0;i3;i+) s.push(i);for(i=0;i5;i+) couts.pop()endl;主程序void main()catch (pushOnFull ex)ex.
13、showReason();catch(popOnEmpty ex)ex.showReason();主要內(nèi)容6.2 類模板6.4 標準模板庫簡介6.3 異常處理6.1 函數(shù)模板1、基本概念C+的新特征是采用了標準模板庫STL,各編譯器商均把STL作為編譯器的一部分提供。STL是一個基于模板的容器類庫,包括鏈表、隊列和堆棧,此外還包括施加在這些容器類庫之上的常用算法。容器、迭代器、算法容器類Containers用來管理某類對象的集合,是包容其它對象的對象;這些容器類是C+開發(fā)人員最強有力的工具。順序容器:可以同對成員或元素的順序和隨機訪問,有vector、deque、list關聯(lián)容器:提供按關鍵值
14、訪問元素,有set、multiset、map迭代器Iterators迭代器用來在一個對象群集的元素上進行遍歷。每一種容器類都提供了自己的迭代器,為所有容器提供了一組很小的公共接口,利用這個接口,可以實現(xiàn)一些通用操作,如移動到集群內(nèi)的下一個對象,而不用關心容器內(nèi)數(shù)據(jù)的組織方式(隊列、鏈表、樹等)??梢詫⒌骺闯梢环N智能指針,能夠?qū)崿F(xiàn)在集群元素中的智能移動。算法Algorithms不同容器類中的集群元素的組織形式不同,有的按線性方式存儲,有的按鏈式存儲,有的按樹結(jié)構(gòu)存儲。不同的容器類,都會提供相應的查找、排序、修改等算法,通過迭代器,我們可以編寫獨立于所有容器的通用算法,可以將它們應用到任意容器
15、之上。STL的精華在于將數(shù)據(jù)和操作分離,數(shù)據(jù)由容器類加以管理,操作則有通用的算法定義。2、Vector示例#include #include using namespace std;void main()vector col;int i;for(i=0;i6;+i)col.push_back(i);for(i=0;icol.size();+i)coutcoli ;coutendl;3、迭代器的使用所有容器類都提供一些成員函數(shù),以獲得與該容器類配套的迭代器,通過迭代器,可以方便地遍歷容器元素。迭代器類重載了*、+、=等運算符*:解析當前位置上的元素值+:移動到容器中的下一個元素=:判斷兩個迭代器
16、是否指向同一個位置=:為迭代器復制迭代器示例#include #include using namespace std;void main()list col;for(c=a; c=z; +c)col.push_back(c);list:const_iterator pos;for(pos=col.begin(); pos!=col.end(); +pos)cout*pos ;coutendl;4、算法示例#include #include #include using namespace std;void main()vector col;vector:iterator pos;col.push_back(3);col.push_back(5);co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 景觀方案分工模板(3篇)
- 化工總廠拆除方案(3篇)
- 景區(qū)表演招標方案(3篇)
- 分銷企業(yè)倉庫管理方案(3篇)
- 公司經(jīng)理分級管理方案(3篇)
- 2025年護理注射技術考試題及答案
- 企劃方案模板么(3篇)
- 動物專用防抓產(chǎn)品創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 養(yǎng)殖區(qū)塊鏈溯源應用創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 蘭花植物配送服務創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 2024年全國網(wǎng)絡安全行業(yè)職業(yè)技能大賽(數(shù)據(jù)安全管理員)考試題庫-下(多選、判斷題)
- 儲藏室買賣協(xié)議模板
- 《基于核心素養(yǎng)的提升小學生數(shù)學文本閱讀能力的行動研究》中期報告
- 知識題庫-人社練兵比武競賽測試題及答案(九)
- 2024年浙江溫州樂清市公安局警務輔助人員招聘筆試參考題庫附帶答案詳解
- 妊娠紋的預防與治療方法的課件
- 生化系統(tǒng)培訓課件講解
- 中國茶文化英文
- 2024年教育項目管理培訓課件
- 鉗工中級理論知識試卷與答案
- 住院精神疾病患者自殺風險護理(2023版團標)
評論
0/150
提交評論