《泛型機(jī)制模板》PPT課件.ppt_第1頁
《泛型機(jī)制模板》PPT課件.ppt_第2頁
《泛型機(jī)制模板》PPT課件.ppt_第3頁
《泛型機(jī)制模板》PPT課件.ppt_第4頁
《泛型機(jī)制模板》PPT課件.ppt_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第13章 泛型機(jī)制模板,類模板的定義 類模板的實(shí)例化 模板的編譯 非類型形參和參數(shù)的默認(rèn)值 類模板的友元 類模板作為基類,類模板的定義,類模板允許用戶為類定義一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)或返回值能取任意數(shù)據(jù)類型。 定義格式: template class 標(biāo)識(shí)符 class 類名/;,類模板實(shí)例,定義一個(gè)泛型的、可指定下標(biāo)范圍的、安全的數(shù)組,類模板定義,template class Array int low; int high; T *storage; public: Array(int lh = 0, int rh = 0): low(lh), high(rh) storage = new T high - low + 1; Array(const Array ,類模板的成員函數(shù)的定義,類模板的成員函數(shù)都是函數(shù)模板,模板參數(shù)與類模板相同 形式: Template 返回類型 類模板名:成員函數(shù)名(函數(shù)的形參表) 函數(shù)體 Array類的成員函數(shù)的格式 template 返回類型 Array:函數(shù)名(形式參數(shù)表) 函數(shù)體,Array的成員函數(shù)的實(shí)現(xiàn),template Array ,template Array:Array(const Array ,第13章 泛型機(jī)制模板,類模板的定義 類模板的實(shí)例化 模板的編譯 非類型形參和參數(shù)的默認(rèn)值 類模板的友元 類模板作為基類,類模板的實(shí)例化,編譯器從模板生成一個(gè)特定的類或函數(shù)的過程稱為模板的實(shí)例化。 類模板實(shí)例化后形成一個(gè)模板類。 類模板的實(shí)例化格式如下: 類模板名 對(duì)象名; 如: Array array1(20,30); Array array2(10, 20);,模板類的對(duì)象的使用,我們可以用下列語句輸入array2的值: for (i=10; i=20; +i) array2i = 0.1 * i; 也可以用下列語句輸出array1的值: for (i=20; i=30; +i) cout array1i t;,第13章 泛型機(jī)制模板,類模板的定義 類模板的實(shí)例化 模板的編譯 非類型形參和參數(shù)的默認(rèn)值 類模板的友元 類模板作為基類,模板的編譯,編譯模板時(shí),編譯器進(jìn)行三個(gè)階段的檢查 第一階段是編譯模板定義本身。這個(gè)階段編譯器只是檢查一些諸如漏掉分號(hào)、變量名拼寫錯(cuò)誤之類的語法錯(cuò)誤。 第二階段是編譯器看到模板使用時(shí)。對(duì)于函數(shù)模板,檢查實(shí)際參數(shù)的數(shù)目和類型是否恰當(dāng)。對(duì)于類模板可以檢測出提供的模板的實(shí)際參數(shù)的數(shù)目是否正確。 第三階段是實(shí)例化。編譯器徹底編譯模板。 所以,調(diào)試包含類模板的程序時(shí),必須在定義了類模板的對(duì)象并且對(duì)對(duì)象調(diào)用了所有的成員函數(shù)后,才能說明類模板的語法是正確的。,第13章 泛型機(jī)制模板,類模板的定義 類模板的實(shí)例化 模板的編譯 非類型形參和參數(shù)的默認(rèn)值 類模板的友元 類模板作為基類,非類型形參,模板的形式參數(shù)不一定都是類型,也可以是非類型的參數(shù)。 在模板實(shí)例化時(shí),類型參數(shù)用一個(gè)系統(tǒng)內(nèi)置類型的名字或一個(gè)用戶已定義類的名字作為實(shí)際參數(shù),而非類型參數(shù)將用一個(gè)值作為實(shí)際參數(shù)。非類型的模板實(shí)參的值必須是編譯時(shí)的常量。,非類型形參實(shí)例,定義了一個(gè)安全的、可指定下標(biāo)范圍的、且下標(biāo)范圍必須是編譯時(shí)的常量的類模板Array。(相當(dāng)于C+中的普通數(shù)組),設(shè)計(jì)考慮,在定義類模板時(shí),數(shù)組的大小是不知道的,但在編譯時(shí)必須給出。 這可以通過非類型參數(shù)實(shí)現(xiàn):該類模板有三個(gè)模板參數(shù):數(shù)組元素的類型、數(shù)組下標(biāo)的上下界。前者為類型參數(shù),后者為非類型參數(shù)。,類定義,template class Array T storagehigh - low + 1; public: T ,類模板的使用,定義一個(gè)下標(biāo)范圍為10到20的整型數(shù)組,可用下列語句: Array array;,參數(shù)的默認(rèn)值,模板參數(shù)和普通的函數(shù)參數(shù)一樣,也可以指定默認(rèn)值。如果前例中的類模板Array經(jīng)常被實(shí)例化為整型數(shù)組,則可在類模板定義時(shí)指定缺省值: template class Array ; 當(dāng)要定義整型數(shù)組array時(shí),就可以不指定模板的實(shí)參: Array array;,第13章 泛型機(jī)制模板,類模板的定義 類模板的實(shí)例化 模板的編譯 非類型形參和參數(shù)的默認(rèn)值 類模板的友元 類模板作為基類,類模板的友元,類模板可以聲明兩種友元: 聲明普通的類或全局函數(shù)為所定義的類模板的友元 聲明某個(gè)類模板或函數(shù)模板的實(shí)例是所定義類模板的友元,普通友元,定義普通類或全局函數(shù)為所定義類模板的友元的聲明格式如下所示: template class A friend class B; friend void f(); ; 該定義聲明了類B和全局函數(shù)f是類模板A的友元。B的所有的成員函數(shù)和全局函數(shù)f可以訪問類模板A的所有實(shí)例的私有成員。,特定實(shí)例的友元,定義一: template friend class B; /類模板聲明 template friend void f(const T 將類模板B的一個(gè)實(shí)例,即模板參數(shù)為int時(shí)的那個(gè)實(shí)例作為類模板A的所有實(shí)例的友元。將函數(shù)模板f對(duì)應(yīng)于模板參數(shù)為int的實(shí)例作為類模板A所有實(shí)例的友元。,特定實(shí)例的友元,定義二 template friend class B; template friend void f(const T 這些友元定義說明了類模板A的特定實(shí)例與使用同一模板實(shí)參的類模板B和函數(shù)模板f的實(shí)例是友元。,類模板的友元實(shí)例,為類模板Array增加一個(gè)輸出運(yùn)算符重載函數(shù),可以直接輸出數(shù)組的所有元素。如有定義 Array array(10,20); 如程序中為該數(shù)組元素賦的值是10到20。即,將10賦給array10,11賦給array11,??梢灾苯佑胏out array;輸出這11個(gè)元素的值。,實(shí)現(xiàn)考慮,要直接輸出數(shù)組的所有元素,可以為類模板Array重載“”運(yùn)算符。 由于Array是一個(gè)類模板,可用于不同類型的數(shù)組,因此,該輸出運(yùn)算符重載函數(shù)也應(yīng)該是函數(shù)模板。 當(dāng)array和operator取相同實(shí)參時(shí),array的實(shí)例將operator的實(shí)例作為友元,重載函數(shù)模板的實(shí)現(xiàn),template ostream ,增加了輸出重載的類模板Array,template class Array; /類模板Array的聲明 template ostream public: 。 ,類模板的友元實(shí)例,定義一個(gè)單鏈表,可以存放任意類型的數(shù)據(jù)。將單鏈表的所有操作都封裝在單鏈表類中,使得單鏈表的用戶只需要知道單鏈表可以做那些操作,而不用去管這些操作是如何實(shí)現(xiàn)的。,實(shí)現(xiàn)考慮,單鏈表中的每個(gè)元素存放在一個(gè)單獨(dú)的節(jié)點(diǎn)中 存儲(chǔ)一個(gè)單鏈表就是存儲(chǔ)一個(gè)指向單鏈表頭節(jié)點(diǎn)的指針。 單鏈表的實(shí)現(xiàn)必須有兩個(gè)類: 節(jié)點(diǎn)類 單鏈表類 由于我們要求的單鏈表是可以處理任何類型,因此這兩個(gè)類都是模板。,類模板node的定義,template class linkList; template ostream ,linkList的定義,template class linkList friend ostream ,類模板linkList成員函數(shù)的實(shí)現(xiàn),template void linkList:makeEmpty() node *p = head-next, *q; head-next=NULL; while (p != NULL) q=p-next; delete p; p=q; ,template void linkList:create(const elemType ,linkList類模板中的輸出運(yùn)算符重載函數(shù)的實(shí)現(xiàn),template ostream ,鏈表類的使用,定義: linkList intList; 該定義產(chǎn)生了類模板的一個(gè)整型實(shí)例 如果想創(chuàng)建這個(gè)單鏈表,可以調(diào)用create函數(shù): intList.create(0); 該調(diào)用將輸入鏈表中的元素值,直到輸入0為止。 要輸出鏈表的所有元素,可以直接輸出: cout intList;,鏈表類的另一種實(shí)現(xiàn),由于結(jié)點(diǎn)類只有鏈表類要用,因此可以將結(jié)點(diǎn)類作為鏈表類的內(nèi)嵌類。 這樣既可以保證結(jié)點(diǎn)類對(duì)于鏈表類的私有性,訪問也更加方便。,第13章 泛型機(jī)制模板,類模板的定義 類模板的實(shí)例化 模板的編譯 非類型形參和參數(shù)的默認(rèn)值 類模板的友元 類模板作為基類,類模板作為基類,類模板可以作為繼承關(guān)系中的基類。自然,從該基類派生出來的派生類還是一個(gè)類模板,而且是一個(gè)功能更強(qiáng)的類模板。 類模板的繼承和普通的繼承方法基本類似。只是在涉及到基類時(shí),都必須帶上模板參數(shù)。,類模板繼承實(shí)例,從linkList類模板派生一個(gè)棧的類模板 棧是一類特殊的線性表,它的插入和刪除都只能在表的一段進(jìn)行。允許插入和刪除的一端稱為棧頂,另一端稱為棧底。棧的常用操作有進(jìn)棧(push)和出棧(pop)。 由于棧是一個(gè)特殊的線性表,因此可以將棧建立在表的基礎(chǔ)上。在單鏈表中,我們可以將表頭定義為棧頂,表尾定義為棧底。因此,棧就是在單鏈表的基礎(chǔ)上增加兩個(gè)操作:push和pop。,棧的類模板的定義,template class stack : public linkList public: void push(const elemType ,類模板stack的使用,定義一個(gè)整型棧:stack st; 進(jìn)棧: for (int i = 1

溫馨提示

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

評(píng)論

0/150

提交評(píng)論