




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第C++模板的特化超詳細(xì)精講目錄一、泛型編程二、函數(shù)模板2.1、函數(shù)模板的概念2.2、函數(shù)模板的格式2.3、函數(shù)模板的原理2.4、函數(shù)模板的實例化2.4.1、隱式實例化2.4.2、顯示實例化三、類模板3.1、類模板的定義格式3.1、類模板的實例化四、模板的特化4.1、概念4.2、函數(shù)模板特化步驟4.3、類模板的特化4.3.1、全特化4.3.2、偏特化
一、泛型編程
我們前面已經(jīng)學(xué)過函數(shù)的重載,實現(xiàn)了在函數(shù)名相同的情況下,實現(xiàn)不同的功能!
例如:
voidSwap(intleft,intright)
inttemp=left;
left=right;
right=temp;
voidSwap(doubleleft,doubleright)
doubletemp=left;
left=right;
right=temp;
voidSwap(charleft,charright)
chartemp=left;
left=right;
right=temp;
}
利用函數(shù)重載雖然實現(xiàn)了通用的交換函數(shù),但是會有以下問題:
重載的函數(shù)僅僅是類型不同,代碼復(fù)用率低,只要有新的類型時,有需要用戶自己增加新的重載函數(shù)。代碼的可維護性低,一個出錯可能所有的重載都出錯。
??????:在C++中是否存在一個模具,通過給這個模具中填充不同的材料(類型),來獲得不同的鑄件(即生成具體的代碼)。
泛型編程:編寫與類型無關(guān)的通用代碼,是代碼復(fù)用的一種的手段。模板是泛型編程的基礎(chǔ)。
二、函數(shù)模板
2.1、函數(shù)模板的概念
函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的特定類型版本。
2.2、函數(shù)模板的格式
templatetypenameT1,typenameT2,,typenameTn
返回值類型函數(shù)名(參數(shù)列表){}
templatetypenameT
voidSwap(Tleft,Tright)
Ttemp=left;
left=right;
right=temp;
??注意:typename是用來定義函數(shù)模板參數(shù)關(guān)鍵字的,也可以用class,但是不可以用struct。
2.3、函數(shù)模板的原理
函數(shù)模板我們可以理解為一個藍(lán)圖,它本身并不是函數(shù),在編譯器編譯階段根據(jù)傳入的實參類型來推演生成對應(yīng)類型的函數(shù)以供調(diào)用,也叫做函數(shù)模板的實例化。
2.4、函數(shù)模板的實例化
用不同類型的對象使用函數(shù)模板時,稱為函數(shù)模板的實例化。模板參數(shù)實例化分為隱式實例化和顯示實例化。
2.4.1、隱式實例化
讓編譯器根據(jù)實參推演模板參數(shù)的實際類型。
templateclassT
TAdd(constTleft,constTright)
returnleft+right;
intmain(){
inta1=10,a2=20;
doubled1=10.0,d2=20.0;
Add(a1,a2);
Add(d1,d2);
//Add(a1,d1);
Add(a1,(int)d1);
system("pause");
return0;
}
2.4.2、顯示實例化
讓函數(shù)名后的中指定模板參數(shù)的實際類型。
intmain(){
inta=10;
doubleb=20.0;
//Add(a,(int)b);//隱式
Addint(a,b);//顯示
system("pause");
return0;
Add(a,b);目的在于如果類型不匹配,編譯器會嘗試進行隱式類型轉(zhuǎn)換,如果無法轉(zhuǎn)換成功編譯器將會報錯。
三、類模板
3.1、類模板的定義格式
templatetypenameT1,typenameT2,,typenameTn
class類模板名
{
//類內(nèi)成員
};
3.1、類模板的實例化
類模板實例化與函數(shù)模板實例化不同,類模板實例化傳的是類型,而函數(shù)模板實例化傳的是對象,類模板實例化需要在類模板名字后面跟上,然后將實例化類型放在中即可!
vectorint
??:與普通類不同,這里vector是類名,而vector才是類型。
四、模板的特化
4.1、概念
通常情況下,我們使用模板可以實現(xiàn)一些與類型無關(guān)的代碼,但是對于一些特殊類型可能會得到一些錯誤的結(jié)果,需要特殊處理。
templateclassT
boolLess(Tleft,Tright){
returnleftright;
template
boolLessDate*(Date*p1,Date*p2)
cout"調(diào)用的模板函數(shù)的特化"endl;
return*p1*p2;
//只要是指針都可以調(diào)用這個,這個思想很重要
//偏特化的帶限制條件(指針類型可調(diào))
templateclassT
boolLess(T*left,T*right)
cout"調(diào)用的函數(shù)模板"endl;
return*left*right;
}
代碼解釋:當(dāng)我們在實參部分傳的是Date型指針的時候,如果不特化處理,結(jié)果會出錯。
上述就是在原模板的基礎(chǔ)上針對特殊類型所進行特殊化的實現(xiàn)方式。模板特化中分為函數(shù)模板特化和類模板特化。
4.2、函數(shù)模板特化步驟
必須要先有一個基礎(chǔ)的函數(shù)模板。關(guān)鍵字template后面接一隊空的。函數(shù)名后跟一對,尖括號中指定需要特化的類型。函數(shù)形參表:必須要和模板函數(shù)的基礎(chǔ)參數(shù)類型完全相同,如果不同編譯器可能會報一些奇怪的錯誤。
templateclassT
boolLess(Tleft,Tright){
returnleftright;
template
boolLessDate*(Date*p1,Date*p2)
cout"調(diào)用的模板函數(shù)的特化"endl;
return*p1*p2;
4.3、類模板的特化
4.3.1、全特化
全特化就是將模板參數(shù)中所有的參數(shù)都確定化
//類模板
templateclassT1,classT2
classdata
public:
data(T1a,T2b)
:_a(a)
,_b(b)
cout"dataT1,T2"endl;
private:
T1_a;
T2_b;
//全特化
template
classdataint,char
public:
data(inta,charb)
:_a(a)
,_b(b)
cout"全特化dataint,char"endl;
private:
int_a;
char_b;
intmain()
dataint,ints1(1,2);
dataint,chars2(1,'a');
}
4.3.2、偏特化
偏特化:任何針對模板參數(shù)進一步進行條件限制設(shè)計的特化版本。比如對一下類模板:
//類模板
templateclassT1,classT2
classdata{
public:
data(T1a,T2b)
:_a(a)
,_b(b)
cout"dataT1,T2"endl;
private:
T1_a;
T2_b;
};
??????偏特化有以下兩種變現(xiàn)方式:
部分特化:將模板參數(shù)中的一部分參數(shù)特化
//半特化
//1、將模板參數(shù)類表中的一部分參數(shù)特化。
templateclassT1
classdataT1,char{
public:
data(T1a,charb)
:_a(a)
,_b(b)
cout"偏特化dataT1,char"endl;
private:
T1_a;
char_b;
};
參數(shù)進一步限制:偏特化并不僅僅是指特化部分參數(shù),而是針對模板參數(shù)更進一步的條件限制所設(shè)計出來的特化版本。
//2、偏特化并不僅僅是指特化部分參數(shù),而是針對模板參數(shù)更進一步的條件限制所設(shè)計出來的一個特化版本。
templateclassT1,classT2
classdataT1*,T2*{
public:
data(T1a,charb)
:_a(a)
,_b(b)
cout"DataT1*,T2*"endl;
private:
T1_a;
T2_b;
templateclassT1,classT2
classdataT1,T2
public:
data(constT1a,constT2b)
:_a(a)
,_b(b)
{cout"DataT1,T2"en
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)鎮(zhèn)-工作總結(jié)及今后五年工作計劃
- 公司廣播播音管理制度
- 公司職工租房管理制度
- 河南省安陽市2024~2025學(xué)年 高三下冊3月檢測數(shù)學(xué)試卷附解析
- 安徽省六安市2024-2025學(xué)年高二下冊B班3月月考數(shù)學(xué)試卷附解析
- 互動式文案設(shè)計研究-洞察闡釋
- 云浮羅定市招聘醫(yī)療衛(wèi)生人才筆試真題2024
- 2025年護理技能競賽試題
- 臨床支氣管囊腫與肺大泡鑒別
- 重慶間位芳綸生產(chǎn)線項目可行性研究報告(范文參考)
- 2025年高考全國二卷數(shù)學(xué)高考真題解析 含參考答案
- 2025年日歷表全年(打印版)完整清新每月一張
- 2024年浙江省中考數(shù)學(xué)試題及答案
- MOOC 學(xué)術(shù)英語寫作-東南大學(xué) 中國大學(xué)慕課答案
- 新聞學(xué)概論ppt全套教學(xué)課件
- 2022更新國家開放大學(xué)電大本科《英語教學(xué)理論與實踐》2023-2024期末試題及答案(試卷代號:1366)
- 2022年中南大學(xué)網(wǎng)絡(luò)教育《公務(wù)員制度-》在線作業(yè)二及參考答案
- WNS鍋爐產(chǎn)品制造工藝檢驗流程卡
- 稀土產(chǎn)業(yè)園建設(shè)項目建議書(參考范文)
- Q∕GDW 12166-2021 換流站直流類設(shè)備質(zhì)量評級技術(shù)導(dǎo)則
- 型鍋爐高硫無煙煤煙氣袋式除塵濕式脫硫系統(tǒng)設(shè)計
評論
0/150
提交評論