




已閱讀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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 上市公司用章管理制度
- 業(yè)主活動(dòng)之家管理制度
- 五一假期景點(diǎn)管理制度
- 大學(xué)生心理健康 培訓(xùn)
- 初三數(shù)學(xué)教師教學(xué)反思
- 大學(xué)生心理健康教育研究論文
- 臨沂揚(yáng)塵治理管理制度
- iatf講師管理制度
- 優(yōu)化設(shè)計(jì)制服管理制度
- 產(chǎn)品研發(fā)日常管理制度
- 救護(hù)車注冊(cè)登記審批表
- 口腔頜面部手術(shù)的麻醉PPT學(xué)習(xí)教案
- 放行考試復(fù)習(xí)題目-放行人員理論試題規(guī)章部分
- 柴油供貨運(yùn)輸服務(wù)方案(完整版)
- 2022教科版五年級(jí)科學(xué)下冊(cè)第四單元熱全套教學(xué)設(shè)計(jì)[表格式]
- 年普通高校(中專招生考生體格檢查表
- 天津市河西區(qū)20142015學(xué)年度小升初數(shù)學(xué)試卷匯編
- PEP英語(四下)-Unit-1-My-school--A-let's-learn教學(xué)反思
- 鐵路貨物運(yùn)價(jià)規(guī)則 鐵運(yùn)[2005]46號(hào)
- 迪恩斯改編作品《山楂樹》Thorntree(UralRowanTree);RolandDyens古典吉他譜(精選)
- 武漢大學(xué)分子生物學(xué)_2007期末試卷A
評(píng)論
0/150
提交評(píng)論