面向?qū)ο蟪绦蛟O計語言C-_第1頁
面向?qū)ο蟪绦蛟O計語言C-_第2頁
面向?qū)ο蟪绦蛟O計語言C-_第3頁
面向?qū)ο蟪绦蛟O計語言C-_第4頁
面向?qū)ο蟪绦蛟O計語言C-_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第十章 模板丘志杰電子科技大學計算機學院 軟件學院2022/7/251 C+最重要的特征之一就是代碼重用,為了實現(xiàn)代碼重用,代碼必須具有通用性。通用的代碼需要不受數(shù)據(jù)類型的影響,并且可以自動適應數(shù)據(jù)類型的變化。這種程序設計類型稱為參數(shù)化程序設計(泛型程序設計)。2022/7/252模板是C+支持參數(shù)化程序設計的工具,通過它可以實現(xiàn)參數(shù)化多態(tài)性。所謂的參數(shù)化多態(tài)性,就是將程序所處理的對象的類型參數(shù)化,使得一段程序可以處理多種不同類型的對象。2022/7/253函數(shù)模板和模板函數(shù)請大家考慮這樣的問題:寫一個函數(shù)求兩個值中的最大者。作為強類型的語言,C+ “不允許”也不應該兩種不同類型的參數(shù)進行比較

2、。一般的解決辦法就是寫一系列的函數(shù),來分別完成整型、浮點型和用戶自定義類型的求解。int max(int x,int y)float max(float x,float y)可以想像,所有這些函數(shù)(的代碼)幾乎都是一模一樣的,只是操作的類型不同。這使程序代碼變得累贅而加大維護難度。2022/7/254一個變通的方法是使用宏定義:#define max(x, y) (x) (y) ? (x) : (y)這樣做雖然解決了代碼維護問題,但是由于宏定義只是在編譯時進行簡單的宏展開,避開了類型檢查機制,因此可能帶來一些難以發(fā)覺的錯誤。2022/7/255使用C+的模板可以輕松地解決上述問題。在這種情況下

3、,數(shù)據(jù)類型本身就是一個參數(shù),例如max函數(shù)的模板可以定義為:template T max(T x, T y) return x y ? x : y; 關(guān)鍵字template后的尖括號表明,max函數(shù)要用到一個叫做T的參數(shù)(我們稱作模板參數(shù)),而這個參數(shù)是一種類型。該模板的含義就是無論參數(shù)T為int、char或其他數(shù)據(jù)類型(包括類類型),函數(shù)max的語意都是對x和y求最大值。2022/7/256這樣定義的max代表了一類具有相同程序邏輯的函數(shù),它不是一個真正的函數(shù),被稱為函數(shù)模板。函數(shù)模板本身是不被編譯的,所以函數(shù)模板不能直接使用,必須被實例化后,也就是給定類型參數(shù)T后才能使用:void mai

4、n()double a = 1.0, b;b = max(a, 2.0); 在上面的代碼中,函數(shù)模板接受了一個隱含的參數(shù):double,編譯器自動將函數(shù)模板擴展成一個完整的關(guān)于double數(shù)據(jù)比較大小的函數(shù),然后再在函數(shù)模板被調(diào)用的地方產(chǎn)生合適的函數(shù)調(diào)用代碼。由函數(shù)模板實例化出的函數(shù)稱為模板函數(shù)。2022/7/257函數(shù)模板與模板函數(shù)的關(guān)系:模板函數(shù)max(int x,int y)函數(shù)模板max(T x,T y)模板函數(shù)max(double x,double y)模板函數(shù)max(X x,X y)實例化實例化實例化就像類和對象的關(guān)系一樣,函數(shù)模板將具有相同正文的一類函數(shù)抽象出來,可以適應任意類型

5、T。2022/7/258請思考對于上述的max函數(shù)模板,如果參與比較的是兩個類對象(如Complex類的對象),該怎么辦?Complex c1,c2,c3;c3=max(c1,c2);那么編譯器將不能明白“”運算符作用在類類型上是什么意思。在這種情況下,為了避免這個問題,必須為參與運算的類類型重載“”運算符。2022/7/259重載模板函數(shù)請思考下面情況: void Func(int num,char ch)int a=max(num,ch);/錯誤int b=max(ch,num);/錯誤在這種情況下,為函數(shù)模板提供了兩個不同的類型(int和char),那么這也會引起錯誤:編譯器無法按模板的

6、規(guī)則實例化出那樣的函數(shù)。但是int和char直接的隱式類型轉(zhuǎn)換是很普遍的。解決上述問題的,C+允許一個函數(shù)模板可以使用多個模板參數(shù)或者重載一個函數(shù)模板。2022/7/2510例子:使用多個模板參數(shù)template T max(T x,D y)return (xy)?x:y;void main()int a=9;char b=34;int rr=max(a,b);2022/7/2511例子:重載一個函數(shù)模板/在redhat下使用g+編譯并執(zhí)行下面程序template T max(T x,T y)return (xy)?x:y;int max(int x,int y)return (xy)?x:y

7、;void main()int num=1;char ch=2;max(num,num); /調(diào)用max(int,int)max(ch,ch); /調(diào)用max(T,T)max(num,ch); /調(diào)用max(int,int)max(ch,num); /調(diào)用max(int,int)2022/7/2512類模板與模板類請看下面雙向鏈表的例子:class nodeint value;node *prev,*next;public:node()prev=NULL;next=NULL;void setValue(int value)this-value=value;void append(node *p

8、);2022/7/2513void node:append(node *p)p-next=this-next;p-prev=this;if(next!=NULL)next-prev=p;next=p;void main( )node *list_head;node node,node1,node2;node.setValue(1);node1.setValue(2);node2.setValue(3);list_head=&node;list_head-append(&node1);list_head-append(&node2);2022/7/2514如果鏈表中的節(jié)點要保存char、doub

9、le甚至是類類型的數(shù)據(jù)呢?該如何辦?為了讓該雙向鏈表適應不同的類型,我們不得不寫一系列的類,諸如int型node類、double型node類、以及類類型node類。而這些類除了操作的類型不同外,其它的部分都幾乎一模一樣。這對我們管理源代碼帶來極大的麻煩。類模板機制比較完美地解決了這個問題,我們將node類改造如下:2022/7/2515template class nodeT value;node *prev,*next;public:node()prev=NULL;next=NULL;void setValue(T value)this-value=value;void append(nod

10、e *p);2022/7/2516template void node:append(node *p)p-next=this-next;p-prev=this;if(next!=NULL)next-prev=p;next=p;void main( )node *list_head;node node,node1,node2;node.setValue(1);node1.setValue(2);node2.setValue(3);list_head=&node;list_head-append(&node1);list_head-append(&node2);2022/7/2517用template來聲明一個類模板,node是該類模板的名字。類外實現(xiàn)成員函數(shù)的語法為:template void node:append(node *p).用模板實參實例化的類稱為模板類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論