




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+面向?qū)ο蟪绦蛟O(shè)計(jì)教程,第3章 模板,3.1 模板的概念,模板,使用模板可以建立具有通用類型的函數(shù)庫或類庫,為一系列邏輯功能相同而數(shù)據(jù)類型不同的函數(shù)或類創(chuàng)建框架 模板提供了一種重用程序源代碼的有效方法,方便了大規(guī)模的軟件開發(fā),模板的概念,模板的本質(zhì)就是將所處理的數(shù)據(jù)類型說明為參數(shù),模板是對(duì)具有相同特性的函數(shù)或類的再抽象,將程序所處理的數(shù)據(jù)的類型參數(shù)化,這樣可使一段程序代碼能用于處理多種不同類型的數(shù)據(jù)。 C+程序由類和函數(shù)組成,類對(duì)應(yīng)類模板,函數(shù)對(duì)應(yīng)函數(shù)模板。,引入函數(shù)模板,考察三個(gè)Swap()函數(shù),分別用于交換兩個(gè)整型數(shù)、交換兩個(gè)浮點(diǎn)實(shí)型數(shù)以及交換兩個(gè)雙精度實(shí)型數(shù) 這三個(gè)Swap()函數(shù)的功
2、能完全一樣,只有所處理的數(shù)據(jù)的類型不同,void Swap(int / 通過循環(huán)賦值交換x,y 這樣得到可以將任一類型ElemType的兩個(gè)數(shù)據(jù)進(jìn)行互換的函數(shù)模板。,引入類模板,三個(gè)類Integer、Float和Double分別用來處理整型數(shù)、浮點(diǎn)型實(shí)數(shù)以及雙精度實(shí)型數(shù) 這三種類的處理功能完全一樣,只有所處理的數(shù)據(jù)的類型不同,/ 聲明整型類 class Integer private: / 數(shù)據(jù)成員 int num;/ 數(shù)據(jù)值 public: / 公有函數(shù) Integer(int n = 0): num(n) / 構(gòu)造函數(shù) void Set(int n) num = n; / 設(shè)置數(shù)據(jù)值 in
3、t Get() const return num; / 返回?cái)?shù)據(jù)值 ;,/ 聲明浮點(diǎn)型實(shí)數(shù)類 class Float private: / 數(shù)據(jù)成員 float num;/ 數(shù)據(jù)值 public: / 公有函數(shù) Float(float n = 0): num(n) / 構(gòu)造函數(shù) void Set(float n) num = n; / 設(shè)置數(shù)據(jù)值 float Get() const return num; / 返回?cái)?shù)據(jù)值 ;,/ 聲明雙精度實(shí)型數(shù)類 class Double private: / 數(shù)據(jù)成員 double num;/ 數(shù)據(jù)值 public: / 公有函數(shù) Double(doubl
4、e n = 0): num(n) / 構(gòu)造函數(shù) void Set(double n) num = n; / 設(shè)置數(shù)據(jù)值 double Get() const return num; / 返回?cái)?shù)據(jù)值 ;,上面實(shí)現(xiàn)的三個(gè)類的功能相同,處理不同類型的數(shù)據(jù),采用類型參數(shù)化后就可以處理任何類型,這樣就得到了類模板。使用類模板定義如下: template class Number private: / 數(shù)據(jù)成員 ElemType num;/ 數(shù)據(jù)值 public: / 公有函數(shù) Number(ElemType n = 0): num(n) / 構(gòu)造函數(shù) void Set(ElemType n) num =
5、 n; / 設(shè)置數(shù)據(jù)值 ElemType Get() const return num; / 返回?cái)?shù)據(jù)值 ; 函數(shù)模板或類模板是對(duì)一族函數(shù)或類的描述,模板是使用類型參數(shù)來產(chǎn)生一組函數(shù)或類的機(jī)制。,3.2 函數(shù)模板及模板函數(shù),3.2.1 函數(shù)模板及模板函數(shù),函數(shù)模板是對(duì)一批功能相同的函數(shù)的說明,它不是某一個(gè)具體的函數(shù),是帶有“類型參數(shù)”的一種描述 模板函數(shù)是將函數(shù)模板內(nèi)的“數(shù)據(jù)類型參數(shù)”取某一個(gè)具體的數(shù)據(jù)類型后得到的具體函數(shù),函數(shù)模板的聲明,使用函數(shù)模板的方法是先聲明函數(shù)模板,最后才可以調(diào)用模板函數(shù)。函數(shù)模板的一般聲明格式如下: template 返回值類型 函數(shù)模板名(形參表) / 函數(shù)模板體
6、 或 template 返回值類型 函數(shù)模板名(形參表) / 函數(shù)模板體 ,template是一個(gè)聲明模板的關(guān)鍵字,class在此處并不表示類的意思,只是借用此關(guān)鍵字表示其后是一個(gè)類型參數(shù)。 class 類型參數(shù)名1, class 類型參數(shù)名2, 稱為類型形參表,class和typename的作用相同,都是表示“類型名”,二者可以互換,生成模板函數(shù),在使用函數(shù)模板時(shí),用實(shí)際的數(shù)據(jù)類型具體化(實(shí)例化)類型形式參數(shù),再根據(jù)實(shí)際參數(shù)類型,生成一個(gè)具體的模板函數(shù),模板函數(shù)的函數(shù)體與函數(shù)模板的函數(shù)模板體完全相同,在程序中真正執(zhí)行的代碼是模板函數(shù)的代碼 在使用函數(shù)模板生成模板函數(shù)時(shí),有兩種使用方式: 函數(shù)
7、模板名(實(shí)參表) 或 函數(shù)模板名(實(shí)參表) 第一種使用方式將根據(jù)實(shí)參類型確定類型形式參數(shù)的具體類型,第二種方式中,稱為類型實(shí)參表,用類型實(shí)參表中的類型來確定類型形式參數(shù)具體類型,只有一個(gè)類型形參的函數(shù)模板,類型形參表與類型實(shí)參表通常只包含一個(gè)類型,這時(shí)函數(shù)模板的一般聲明格式如下: template 返回值類型 函數(shù)模板名(形參表) / 函數(shù)模板體 或 template 返回值類型 函數(shù)模板名(形參表) / 函數(shù)模板體 使用函數(shù)模板生成模板函數(shù)的兩種使用方式如下: 函數(shù)模板名(實(shí)參表) 或 函數(shù)模板名(實(shí)參表),例3.1 函數(shù)模板定義與模板函數(shù)的調(diào)用示例。 template ElemType M
8、ax(ElemType x, ElemType y)/ 求x,y的最大值 return x (2, 3.0) endl; / 輸出2,3.0的最大值 system(PAUSE);/ 調(diào)用庫函數(shù)system( ),輸出系統(tǒng)提示信息 return 0; / 返回值0, 返回操作系統(tǒng) ,程序運(yùn)行時(shí)屏幕輸出如下: 2和3的最大值為3 2和3.0的最大值為3 請(qǐng)按任意鍵繼續(xù). . .,3.2.2 重載函數(shù)模板,模板函數(shù)類似于重載函數(shù),但是同一個(gè)函數(shù)模板類型形式參數(shù)具體化(實(shí)例化)后的所有模板函數(shù)必須執(zhí)行相同的代碼,而函數(shù)重載時(shí)在每個(gè)函數(shù)體中可以執(zhí)行不同的代碼,當(dāng)遇到執(zhí)行的代碼有所不同時(shí),不能簡(jiǎn)單地套用函
9、數(shù)模板,而應(yīng)像重載普通函數(shù)那樣進(jìn)行重載 重載函數(shù)模板后,編譯器首先匹配類型完全相同的函數(shù),如果匹配失敗,再尋求函數(shù)模板進(jìn)行匹配,例3.2 重載函數(shù)模板與匹配過程示例。 template ElemType Max(ElemType x, ElemType y)/ 求x,y的最大值 return x y ? y : x;/ 返回x,y的最大值 char *Max(char *str1, char *str2)/ 求str1,str2的最大值 return strcmp(str1, str2) 0 ? str2 : str1;/ 返回str1,str2的最大值 int main()/ 主函數(shù)main
10、() cout 2和3的最大值為 Max(2, 3) endl; / 輸出2,3的最大值, 匹配函數(shù)模板 cout China與American的最大值為 Max(China, American) endl; / 輸出China,American的最大值, 匹配函數(shù) system(PAUSE);/ 輸出系統(tǒng)提示信息 return 0; / 返回值0, 返回操作系統(tǒng) ,程序運(yùn)行時(shí)屏幕輸出如下: 2和3的最大值為3 China與American的最大值為China 請(qǐng)按任意鍵繼續(xù). . .,例3.3 重載函數(shù)模板示例。 template ElemType Max(ElemType x, ElemT
11、ype y)/ 求x,y的最大值 return x ElemType Max(ElemType x, ElemType y, ElemType z)/ 求x,y,z的最大值 ElemType m = x ElemType Max(ElemType a, int n)/ 求a0,a1,.,an-1的最大值 ElemType m = a0;/ 假設(shè)a0為最大值 for (int i = 1; i n; i+) if (m ai) m = ai;/ 如ai更大,則將ai賦值給m return m;/ 返回最大值 int main()/ 主函數(shù)main() int a = 1, 9, 7, 5, 6,
12、 3;/ 定義數(shù)組a cout 數(shù)組a的最大元素值為 Max(a, 6) endl; cout 2和3的最大值為 Max(2, 3) endl; cout 2,3和8的最大值為 Max(2, 3, 8) endl; system(PAUSE);/ 輸出系統(tǒng)提示信息 return 0; / 返回值0, 返回操作系統(tǒng) ,程序運(yùn)行時(shí)屏幕輸出如下: 數(shù)組a的最大元素值為9 2和3的最大值為3 2,3和8的最大值為8 請(qǐng)按任意鍵繼續(xù). . .,3.3 類模板及模板類,類模板及模板類,類模板與函數(shù)模板類似,它可以為任意數(shù)據(jù)類型定義一種模板,使用不同的數(shù)據(jù)類型具體化(實(shí)例化)類模板生成具體的模板類 模板類可
13、以用于生成具體的對(duì)象 ,3.3.1 類模板的聲明及生成模板類,定義一個(gè)類模板與定義函數(shù)模板的格式類似,必須以關(guān)鍵字template開始,類模板的一般聲明形式如下: template class 類模板名 / 類模板體 ; 或 template class 類模板名 / 類模板體 ;,類模板的聲明,類模板的成員函數(shù)不但可以在類模板內(nèi)定義,也可以在類模板外定義。在類模板外定義時(shí),需要采用下面的形式: template 返回值類型 類模板名:成員函數(shù)名(形參表) / 函數(shù)體 或 template 返回值類型 類模板名:成員函數(shù)名(形參表) / 函數(shù)體 ,生成模板類,類模板必須用實(shí)際的數(shù)據(jù)類型具體化(
14、實(shí)例化)類型形式參數(shù),再根據(jù)實(shí)際參數(shù)類型,生成一個(gè)具體的模板類,然后才能用來生成具體對(duì)象。 一般語法格式如下: 類模板名 對(duì)象名;,例3.4 使用類模板的實(shí)例。 / 聲明數(shù)組類模板 template class Array private: / 數(shù)據(jù)成員 ElemType *elem;/ 存儲(chǔ)數(shù)據(jù)元素值 int size;/ 數(shù)組元素個(gè)數(shù) public: / 公有函數(shù) Array(int sz): size(sz) elem = new ElemTypesize; / 構(gòu)造函數(shù) Array() delete elem; / 析構(gòu)函數(shù) void SetElem(ElemType e, int i
15、);/ 設(shè)置元素值 ElemType GetElem(int i) const;/ 求元素值 ; ,例3.4 使用類模板的實(shí)例。 template void Array:SetElem(ElemType e, int i)/ 設(shè)置元素值 if (i = size) cout ElemType Array:GetElem(int i) const/ 求元素值 if (i = size) cout 元素位置錯(cuò)! endl; exit(2);/ 退出程序的運(yùn)行,返回到操作系統(tǒng) return elemi;/ 返回元素值elemi ,例3.4 使用類模板的實(shí)例。 int main()/ 主函數(shù)main(
16、) int a = 1, 9, 7, 5, 6, 3;/ 定義數(shù)組a int n = 6;/ 數(shù)組元素個(gè)數(shù) Array obj(n);/ 定義數(shù)組對(duì)象 int i;/ 定義臨時(shí)變量 for (i = 0; i n; i+) obj.SetElem(ai, i);/ 設(shè)置數(shù)組元素值 for (i = 0; i n; i+) cout obj.GetElem(i) ;/ 輸出元素值 cout endl;/ 換行 system(PAUSE);/ 輸出系統(tǒng)提示信息 return 0; / 返回值0, 返回操作系統(tǒng) ,程序運(yùn)行時(shí)屏幕輸出如下: 1 9 7 5 6 3 請(qǐng)按任意鍵繼續(xù). . .,3.3.2
17、在類型形參表中包含常規(guī)參數(shù)的類模板,在聲明類模板的類型形參表中還可以包含常規(guī)參數(shù),常規(guī)參數(shù)經(jīng)常是數(shù)值。 對(duì)模板類進(jìn)行具體化(實(shí)例化)為模板類時(shí)給這些常規(guī)參數(shù)所提供的表達(dá)式必須是常量表達(dá)式。,例3.5 使用在類型形參表中包含常規(guī)參數(shù)的實(shí)例。 / 聲明數(shù)組類模板 template class Array private: / 數(shù)據(jù)成員 ElemType elemsize;/ 存儲(chǔ)數(shù)據(jù)元素值 public: / 公有函數(shù) void SetElem(ElemType e, int i);/ 設(shè)置元素值 ElemType GetElem(int i) const;/ 求元素值 ; ,常規(guī)參數(shù),例3.5 使用在類型形參表中包含常規(guī)參數(shù)的實(shí)例。 template void Array:SetElem(ElemType e, int i)/ 設(shè)置元素值 if (i = size) cout ElemType Array:GetElem(int i) const/ 求元素值 if (i = size) cout 元素位置錯(cuò)! endl; exit(2);/ 退出程序的運(yùn)行,返回到操作系統(tǒng) return elemi;/ 返回元素值elemi ,例3.5 使用在類型形參表中包含常規(guī)參數(shù)的實(shí)例。 int main()/ 主函數(shù)main() int a = 1, 9,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 古琴文化與演奏藝術(shù)教程書
- 小學(xué)三年級(jí)下冊(cè)數(shù)學(xué)鞏固練習(xí)計(jì)劃
- 2025至2030中國自動(dòng)滴漏式咖啡壺行業(yè)發(fā)展趨勢(shì)分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國腹水治療行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國脫氫乙酸(DHS)行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國脂肪填充奶粉(FFMP)行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030中國膠囊內(nèi)窺鏡和工作站行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國胃食管反流病藥物及器械行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國肥料噴射器行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國聚光類球面透鏡行業(yè)發(fā)展研究與產(chǎn)業(yè)戰(zhàn)略規(guī)劃分析評(píng)估報(bào)告
- 學(xué)校安保服務(wù)方案(技術(shù)方案)
- 2024-2030年中國工業(yè)防銹劑行業(yè)需求動(dòng)態(tài)與應(yīng)用前景預(yù)測(cè)報(bào)告
- 跨學(xué)科主題學(xué)習(xí)-美化校園 2024-2025學(xué)年七年級(jí)地理上冊(cè)新教材教學(xué)課件(人教版2024)
- TZJFS 015-2024 環(huán)境責(zé)任險(xiǎn)風(fēng)險(xiǎn)評(píng)估技術(shù)規(guī)范
- DB511044-2022孤兒成年后社會(huì)融合能力評(píng)估社會(huì)工作服務(wù)指南
- 江蘇省徐州市2023-2024學(xué)年八年級(jí)下學(xué)期期末數(shù)學(xué)試卷(含答案解解)
- 石家莊市國企招聘考試真題題庫2024版
- 人體常見病智慧樹知到期末考試答案章節(jié)答案2024年
- DZ∕T 0051-2017 地質(zhì)巖心鉆機(jī)型式與規(guī)格系列(正式版)
- 企業(yè)5S標(biāo)準(zhǔn)化管理
- 社區(qū)工作者招聘考試歷年真題庫含備考資料
評(píng)論
0/150
提交評(píng)論