




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第淺析C++函數(shù)模板和類(lèi)模板目錄一、函數(shù)模板1、函數(shù)模板的定義和使用2、函數(shù)模板的編譯原理3、函數(shù)模板的聲明二、類(lèi)模板1、類(lèi)模板的定義和使用2、類(lèi)模板的編譯原理3、類(lèi)模板的繼承和派生C++語(yǔ)言全盤(pán)繼承了C語(yǔ)言的標(biāo)準(zhǔn)庫(kù),其中包換非常豐富的系統(tǒng)函數(shù),例如輸入/輸出函數(shù)、數(shù)學(xué)函數(shù)、字符串處理函數(shù)和動(dòng)態(tài)內(nèi)存分配函數(shù)等。C++語(yǔ)言另外又增加了一些新的庫(kù),我們把C++語(yǔ)言新增的這部分庫(kù)稱為C++標(biāo)準(zhǔn)庫(kù)。C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類(lèi)模板。模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類(lèi)是C++語(yǔ)言中兩種主要的重用代碼形式。代碼模板使源程序更加凝練。
一、函數(shù)模板
函數(shù)模板的基本原理是通過(guò)數(shù)據(jù)類(lèi)型的參數(shù)化,將一組算法相同但所處理數(shù)據(jù)類(lèi)型不同的重載函數(shù)凝練成一個(gè)函數(shù)模板。
1、函數(shù)模板的定義和使用
函數(shù)模板的定義語(yǔ)法形式:
template類(lèi)型參數(shù)列表
函數(shù)類(lèi)型函數(shù)名(形參參數(shù)列表)
{
函數(shù)體
}
函數(shù)模板的幾點(diǎn)語(yǔ)法細(xì)則:
定義函數(shù)模板以關(guān)鍵字template開(kāi)頭類(lèi)型參數(shù)列表可以聲明一個(gè)或多個(gè)類(lèi)型參數(shù),每個(gè)類(lèi)型參數(shù)以typename類(lèi)型參數(shù)名或class類(lèi)型參數(shù)名的形式聲明,類(lèi)型參數(shù)之間用逗號(hào),隔開(kāi)。函數(shù)模板的其余部分,包括函數(shù)類(lèi)型、函數(shù)名、形式參數(shù)列表以及函數(shù)體,它們和普通函數(shù)的定義形式?jīng)]有什么區(qū)別。使用typename和class聲明的類(lèi)型參數(shù)可視為一種新的數(shù)據(jù)類(lèi)型,可用來(lái)定義函數(shù)類(lèi)型(即返回值類(lèi)型)、形參類(lèi)型和局部變量類(lèi)型。類(lèi)型參數(shù)是表示數(shù)據(jù)類(lèi)型的參數(shù),再實(shí)際調(diào)用時(shí)可被替換成任意數(shù)據(jù)類(lèi)型
示例:
#includeiostream
usingnamespacestd;
templatetypenameT//定義函數(shù)模板Max,聲明一個(gè)類(lèi)型參數(shù)T
TMax(Tx,Ty)//使用類(lèi)型參數(shù)T定義函數(shù)類(lèi)型和形參x和y的類(lèi)型
return(xyx:y);
intmain()
coutMax(5,10)endl;//調(diào)用返回最大值10
coutMax(5.2,10.2)endl;//調(diào)用返回最大值10.2
return0;
}
函數(shù)模板可以像普通函數(shù)一樣被調(diào)用。再調(diào)用者看來(lái),函數(shù)模板的類(lèi)型參數(shù)像是一種通用數(shù)據(jù)類(lèi)型。
2、函數(shù)模板的編譯原理
函數(shù)模板是具有類(lèi)型參數(shù)的函數(shù)。類(lèi)型參數(shù)是表示數(shù)據(jù)類(lèi)型的參數(shù),可指代任意一種實(shí)際數(shù)據(jù)類(lèi)型。編譯器再編譯到函數(shù)模板的調(diào)用語(yǔ)句時(shí),根據(jù)位置對(duì)應(yīng)關(guān)系從實(shí)參數(shù)據(jù)類(lèi)型推導(dǎo)出類(lèi)型參數(shù)所指代的數(shù)據(jù)類(lèi)型,然后按照函數(shù)模板自動(dòng)生成一個(gè)該類(lèi)型的函數(shù)定義代碼。不同類(lèi)型實(shí)參的函數(shù)模板調(diào)用語(yǔ)句將生成不同類(lèi)型的重載函數(shù)。函數(shù)模板將數(shù)據(jù)類(lèi)型參數(shù)化,調(diào)用時(shí)會(huì)呈現(xiàn)參數(shù)多態(tài)性。
3、函數(shù)模板的聲明
跟普通函數(shù)一樣函數(shù)模板也需要先定義后調(diào)用的原則。如果函數(shù)模板定義再調(diào)用后,或定義再其他程序文件中,則應(yīng)先聲明后調(diào)用。函數(shù)模板的聲明語(yǔ)法形式為:
template類(lèi)型參數(shù)列表
函數(shù)類(lèi)型函數(shù)名(形參參數(shù)列表);
或
template類(lèi)型參數(shù)列表函數(shù)類(lèi)型函數(shù)名(形參參數(shù)列表);
#includeiostream
usingnamespacestd;
templatetypenameT//函數(shù)模板Max定義聲明
TMax(Tx,Ty);
intmain()
coutMax(5,10)endl;//函數(shù)模板Max使用
coutMax(5.2,10.2)endl;
return0;
templatetypenameT//函數(shù)模板Max定義
TMax(Tx,Ty)
return(xyx:y);
}
程序員再編程時(shí)可以靈活使用模板技術(shù)。在定義多個(gè)重載函數(shù)時(shí)可以考慮是否將他們定義成一個(gè)函數(shù)模板,這樣可以凝練函數(shù)代碼。再定義單個(gè)函數(shù)時(shí)也可以考慮定義成函數(shù)模板,這樣可以提高函數(shù)代碼的可重用性。對(duì)于調(diào)用函數(shù)模板的程序員而言,函數(shù)模板和普通函數(shù)沒(méi)有什么區(qū)別。唯一不同的時(shí)函數(shù)模板可以處理不同類(lèi)型的數(shù)據(jù)。
二、類(lèi)模板
應(yīng)用模板技術(shù),也可以將一組功能相同但所處理數(shù)據(jù)類(lèi)型不同的類(lèi)凝練成一個(gè)類(lèi)模板。編譯時(shí),再由編譯器按照類(lèi)模板自動(dòng)生成針對(duì)不同數(shù)據(jù)類(lèi)型的類(lèi)定義代碼。
1、類(lèi)模板的定義和使用
定義類(lèi)模板的語(yǔ)法形式:
template類(lèi)型參數(shù)列表
class類(lèi)名//類(lèi)聲明部分
{
類(lèi)成員聲明
}
//類(lèi)實(shí)現(xiàn)部分:所有類(lèi)外定義的函數(shù)成員,必須按如下的語(yǔ)法形式將它們定義成函數(shù)模板
template類(lèi)型參數(shù)列表
函數(shù)類(lèi)型類(lèi)名類(lèi)型參數(shù)名列表::函數(shù)名(形式參數(shù)列表)
{函數(shù)體}
類(lèi)模板的幾點(diǎn)語(yǔ)法細(xì)則:
定義類(lèi)模板以關(guān)鍵字template開(kāi)頭類(lèi)型參數(shù)列表可以聲明一個(gè)或多個(gè)類(lèi)型參數(shù),每個(gè)類(lèi)型參數(shù)以typename類(lèi)型參數(shù)名或class類(lèi)型參數(shù)名的形式聲明,類(lèi)型參數(shù)之間用逗號(hào),隔開(kāi)。類(lèi)模板定義的其余部分,包括類(lèi)名、類(lèi)成員聲明以及類(lèi)實(shí)現(xiàn)部分,它們和普通類(lèi)的定義形式基本相同。定義類(lèi)模板的函數(shù)成員,如果再類(lèi)內(nèi)定義(內(nèi)聯(lián)函數(shù)),其語(yǔ)法形式和普通類(lèi)的函數(shù)成員沒(méi)區(qū)別;如果再類(lèi)外(即類(lèi)實(shí)現(xiàn)部分)定義,則必須按照函數(shù)模板的語(yǔ)法形式來(lái)定義,并且還要再函數(shù)名前面加類(lèi)名類(lèi)型參數(shù)名列表::限定。使用typename和class聲明的類(lèi)型參數(shù)可視為一種新的數(shù)據(jù)類(lèi)型,類(lèi)型參數(shù)是表示數(shù)據(jù)類(lèi)型的參數(shù),再使用類(lèi)模板時(shí)可被替換成任意數(shù)據(jù)類(lèi)型。
定義好的類(lèi)模板可以像普通類(lèi)一樣被用來(lái)定義對(duì)象。使用類(lèi)模板定義對(duì)象時(shí),需要明確給出類(lèi)模板中類(lèi)型參數(shù)所指代的實(shí)際數(shù)據(jù)類(lèi)型。其語(yǔ)法形式如下:類(lèi)模板名實(shí)際數(shù)據(jù)類(lèi)型列表對(duì)象名1,對(duì)象名2.....;
類(lèi)模板語(yǔ)法示例:
在類(lèi)內(nèi)定義函數(shù)成員(內(nèi)聯(lián))
#includeiostream
usingnamespacestd;
templatetypenameT//類(lèi)模板A
classA//類(lèi)聲明部分
private://聲明兩個(gè)私有數(shù)據(jù)成員
Ta1;
inta2;
public:
A(Tp1,intp2)//定義構(gòu)造函數(shù)
{a1=p1;a2=p2}
voidShow()//顯示數(shù)據(jù)成員
{couta1","a2endl;}
TSum()//求數(shù)據(jù)成員的和
{return(T)(a1+a2);}
//無(wú)類(lèi)實(shí)現(xiàn)部分
intmain()
//用類(lèi)模板定義對(duì)象
Adoubleo1(10.5,6);//double型對(duì)象
o1.Show();//顯示:10.5,6
couto1.Sum()endl;//顯示:16.5
Ainto2(10,6);//int型對(duì)象
o2.Show();//顯示:10,6
couto1.Sum()endl;//顯示:16
return0;
}
在類(lèi)外定義函數(shù)模板成員
#includeiostream
usingnamespacestd;
templatetypenameT//類(lèi)模板A
classA//類(lèi)聲明部分
private://聲明兩個(gè)私有數(shù)據(jù)成員
Ta1;
inta2;
public:
A(Tp1,intp2);//定義構(gòu)造函數(shù)
voidShow();//顯示數(shù)據(jù)成員
TSum();//求數(shù)據(jù)成員的和
//類(lèi)實(shí)現(xiàn)部分
templatetypenameT
AT::A(Tp1,intp2)
{a1=p1;a2=p2}
templatetypenameT
voidAT::Show()
{couta1","a2endl;}
templatetypenameT
TAT::Sum()
{return(T)(a1+a2);}
intmain()
//用類(lèi)模板定義對(duì)象
Adoubleo1(10.5,6);//double型對(duì)象
o1.Show();//顯示:10.5,6
couto1.Sum()endl;//顯示:16.5
Ainto2(10,6);//int型對(duì)象
o2.Show();//顯示:10,6
couto1.Sum()endl;//顯示:16
return0;
}
2、類(lèi)模板的編譯原理
當(dāng)定義到類(lèi)模板定義對(duì)象語(yǔ)句時(shí),編譯器將根據(jù)所給出的實(shí)際數(shù)據(jù)類(lèi)型來(lái)取代類(lèi)型參數(shù)T。例如Adoubleo1(10.5,6);編譯時(shí)將類(lèi)模板中類(lèi)類(lèi)型參數(shù)綁定到某個(gè)具體數(shù)據(jù)類(lèi)型的過(guò)程,稱為類(lèi)模板的實(shí)例化。實(shí)例化所生成的類(lèi)稱為類(lèi)模板的實(shí)例類(lèi)。實(shí)例類(lèi)是一個(gè)普通的類(lèi),可以用來(lái)定義對(duì)象。
類(lèi)模板編譯原理:類(lèi)模板是具有類(lèi)型參數(shù)的類(lèi)。類(lèi)型參數(shù)是表示數(shù)據(jù)類(lèi)型的參數(shù),可指代任意實(shí)際數(shù)據(jù)類(lèi)型。編譯器在編譯到使用類(lèi)模板定義對(duì)象語(yǔ)句時(shí),將首先按照所給定的實(shí)際數(shù)據(jù)類(lèi)型對(duì)類(lèi)模板進(jìn)行實(shí)例化,生成一個(gè)實(shí)例類(lèi)。最終,編譯器使用實(shí)例類(lèi)來(lái)定義所需要的對(duì)象。
3、類(lèi)模板的繼承和派生
類(lèi)模板可以被繼承,派生出新類(lèi)。以類(lèi)模板為基類(lèi)定義派生類(lèi),可以在派生時(shí)實(shí)例化,也可以繼續(xù)定義派生類(lèi)模板。
1、定義實(shí)例化派生類(lèi)
定義實(shí)例化派生類(lèi)就是在派生類(lèi)繼承基類(lèi)的時(shí)候?qū)㈩?lèi)型參數(shù)賦值,此時(shí)派生類(lèi)對(duì)基類(lèi)進(jìn)行實(shí)例化。
實(shí)例化派生類(lèi)示例
#includeiostream
usingnamespacestd;
templatetypenameT//類(lèi)模板基類(lèi)Base
classBase//類(lèi)聲明部分
private://聲明私有數(shù)據(jù)成員
Ta;
public:
Base(Tx){a=x;}
voidShow(){cout"a="a",";}
//無(wú)類(lèi)實(shí)現(xiàn)部分
classDerived:publicBasedouble//公有繼承基類(lèi)模板Base,派生時(shí)實(shí)例化
private://聲明新增數(shù)據(jù)成員
intb;
public:
//注意派生類(lèi)構(gòu)造函數(shù)寫(xiě)法
Derived(doublep1,intp2):Basedouble(p1){b=p2;}
//新增函數(shù)成員Show
voidShow(){Basedouble::Show();cout"b="bendl;}
intmain()
Derivedobj(10.5,6);//定義派生類(lèi)Derived對(duì)象obj
obj.Show();//顯示結(jié)果:a=10.5,b=6
return0;
}
在編譯到派生類(lèi)Derived的定義代碼時(shí),編譯器將按照所給定的實(shí)際數(shù)據(jù)類(lèi)型double對(duì)類(lèi)模板Base進(jìn)行實(shí)例化,生成一個(gè)double型的實(shí)例類(lèi),最終派生類(lèi)Derived繼承的是該實(shí)例類(lèi)。
2、定義派生類(lèi)模板
定義派生類(lèi)模板是派生類(lèi)在繼承類(lèi)模板基類(lèi)時(shí)不進(jìn)行實(shí)例化,因此派生類(lèi)仍然是一個(gè)類(lèi)模板。
派生類(lèi)模板示例
#includeiostream
usingnamespacestd;
templatetypenameT//類(lèi)模板基類(lèi)Base
classBase//類(lèi)聲明部分
private://聲明私有數(shù)據(jù)成員
Ta;
public:
Base(Tx){a=x;}
voidShow(){cout"a="a",";}
//無(wú)類(lèi)實(shí)現(xiàn)部分
//公有繼承類(lèi)模板Base,派生類(lèi)仍為類(lèi)模板
templatetypenameT,typenameTT//新增類(lèi)型參數(shù)TT
classDerived:publicBaseT//公有繼承基類(lèi)模板Base,定義派生類(lèi)模板
private://聲明新增數(shù)據(jù)成員
TTb;
public:
//注意派生類(lèi)構(gòu)造函數(shù)寫(xiě)法
Derived(Tp1,TTp2):BaseT(p1){b=p2;}
//新增函數(shù)成員Show
voidShow(){BaseT::Show();cout"b="bendl;}
intmain()
Deriveddouble,intobj(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息系統(tǒng)監(jiān)理師2025年考前沖刺試題及答案
- 稀土金屬加工質(zhì)量改進(jìn)項(xiàng)目策劃與實(shí)施技巧考核試卷
- 微生物肥料在促進(jìn)作物對(duì)養(yǎng)分脅迫適應(yīng)性的生理響應(yīng)研究考核試卷
- 釀造企業(yè)產(chǎn)品創(chuàng)新考核試卷
- 管理學(xué)與行政結(jié)合試題及答案
- 嵌入式系統(tǒng)開(kāi)發(fā)的商業(yè)機(jī)遇試題及答案
- 行政組織的變革策略探討試題及答案
- 全面關(guān)注公路工程考試的發(fā)展趨勢(shì)試題及答案
- 信息系統(tǒng)監(jiān)理師高級(jí)課程介紹試題及答案
- 嵌入式系統(tǒng)高效遠(yuǎn)程控制試題及答案
- 保潔協(xié)議書(shū)合同范本
- 2025餐飲服務(wù)員勞動(dòng)合同模板
- 2025至2030年中國(guó)智能學(xué)習(xí)機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025屆高三高考押題預(yù)測(cè)卷 物理(黑吉遼蒙卷03) 含解析
- (高清版)DG∕TJ 08-7-2021 建筑工程交通設(shè)計(jì)及停車(chē)庫(kù)(場(chǎng))設(shè)置標(biāo)準(zhǔn)
- 2025部編版語(yǔ)文二年級(jí)下冊(cè)第八單元測(cè)試卷(含答案)
- 教育咨詢保密協(xié)議書(shū)
- 無(wú)房無(wú)車(chē)離婚協(xié)議書(shū)
- 南師附中高三數(shù)學(xué)備忘錄及答案詳解
- 2025-2030年中國(guó)甲巰咪唑片行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025年安徽國(guó)控資產(chǎn)管理有限公司第二季度社會(huì)招聘5人筆試參考題庫(kù)附帶答案詳解
評(píng)論
0/150
提交評(píng)論