模板就是實(shí)現(xiàn)代碼重用機(jī)制的一種工具,它可以實(shí)現(xiàn)類(lèi)型參數(shù)化,即把類(lèi)型定義為參數(shù), 從而實(shí)現(xiàn)了真正的代碼可重用性。模版可以分為兩類(lèi),一個(gè)是函數(shù)模版,另外一個(gè)是類(lèi)模版。
一、函數(shù)模板函數(shù)的重載可以實(shí)現(xiàn)一個(gè)函數(shù)名多用,將是實(shí)現(xiàn)相同或類(lèi)似功能的函數(shù)用一個(gè)函數(shù)名定義,雖然含義清楚,但仍要分別定義每一個(gè)函數(shù),為此,c++提供函數(shù)模板。建立一個(gè)通用函數(shù),其函數(shù)類(lèi)型和形參類(lèi)型不具體指定,用一個(gè)虛擬的類(lèi)型來(lái)代表,這個(gè)通用函數(shù)就是函數(shù)模板。
#includeusing namespace stdl
template//模板聲明,T為類(lèi)型參數(shù)
T max(T a,T b,T c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
int main()
{
int i1=185, i2=-76, i3=5678,i;
double d1=5.11, d2=231.12, d3=-3214.78,d;
long g1=67854,g2=-912456,g3=673456,g;
i=max(i1,i2,i3);//調(diào)用模板函數(shù),T被int取代
d=max(d1,d2,d3);
g=max(g1,g2,g3);
cout<
上面就是一個(gè)簡(jiǎn)單的模板函數(shù)。
不難看出,定義函數(shù)模板的一般形式為:
template函數(shù)定義
此外,typename可換成class。
template的含義即是模板,<>中先寫(xiě)關(guān)鍵字typename(或class),后面跟一個(gè)類(lèi)型參數(shù)T,T是一個(gè)虛擬的類(lèi)型名 ,表明他是一個(gè)類(lèi)型名但并未指明具體類(lèi)型。從而,在函數(shù)定義是用T來(lái)定義的變量a,b,c也是未確定的。當(dāng)函數(shù)調(diào)用時(shí),編譯器會(huì)根據(jù)實(shí)參的類(lèi)型來(lái)確定T的類(lèi)型。
class與typename作用相同,可以互換,但為了與類(lèi)class區(qū)分,一般用typename。
需要注意的是,函數(shù)模板只適用于函數(shù)體相同,函數(shù)參數(shù)個(gè)數(shù)相同而數(shù)據(jù)類(lèi)型不同的情況,如果參數(shù)個(gè)數(shù)不同,則不能使用函數(shù)模板。
二、類(lèi)模板 1.與函數(shù)模板類(lèi)似,有時(shí),有兩個(gè)或多個(gè)類(lèi),其功能相同,僅僅是數(shù)據(jù)類(lèi)型不同如下面聲明了一個(gè)類(lèi),用來(lái)比較兩個(gè)整數(shù)的大小。
class Compare_int
{
public:
Compare_int (int a,int b)//定義構(gòu)造函數(shù)
{x=a;y=b;}
int max()
{return (x>y)?x:y;}
int min()
{return (x
但如果想對(duì)兩個(gè)浮點(diǎn)數(shù)作比較,還需要重新聲明一個(gè)類(lèi):
class Compare_float
{
public:
Compare_float (float a,float b)//定義構(gòu)造函數(shù)
{x=a;y=b;}
float max()
{return (x>y)?x:y;}
float min()
{return (x
顯然,這基本上是重復(fù)性的工作,所以,c++增加了template功能,用來(lái)減少重復(fù)。?
2.類(lèi)模板對(duì)于上面兩個(gè)類(lèi),可以聲明一個(gè)通用的模板,他可以有一個(gè)或多個(gè)虛擬的類(lèi)型參數(shù)
template//聲明一個(gè)模板,虛擬類(lèi)型名為numtype
class Compare
{
public:
Compare(numtype a, numtype b)//定義構(gòu)造函數(shù)
{x=a;y=b;}
numtype max()
{return (x>y)?x:y;}
numtype min()
{return (x
與前面Compare_int不同的是:1.聲明類(lèi)模板要增加一行 template
可以這樣說(shuō)類(lèi)模板是類(lèi)的抽象,類(lèi)是類(lèi)模板的實(shí)例。
類(lèi)模板的使用類(lèi)定義對(duì)象的方法:Compare_int com(4,7);? ,類(lèi)模板定義對(duì)象與此類(lèi)似,但不能直接寫(xiě)Compare com(4,7);因?yàn)镃ompare只是類(lèi)模板名,他不是一個(gè)具體的類(lèi),類(lèi)模板中的類(lèi)型numtype不是一個(gè)實(shí)際的類(lèi)型,只是一個(gè)虛擬的類(lèi)型,不能用來(lái)定義對(duì)象。因此,我們需要一個(gè)實(shí)際的類(lèi)型名來(lái)取代虛擬類(lèi)型 如下:
Compare
不難看出,其一般形式為:類(lèi)模板名<實(shí)際類(lèi)型名>對(duì)象名(參數(shù))
1:先寫(xiě)出一個(gè)實(shí)際的類(lèi)(如上面的Compare_int)
2:將此類(lèi)準(zhǔn)備改變的類(lèi)型名(如int改為float)改成虛擬類(lèi)型名(如上面的numtype)
3:在類(lèi)聲明前加一行
template
4:用類(lèi)模板定義對(duì)象
類(lèi)模板名<實(shí)際類(lèi)型名>對(duì)象名;
類(lèi)模板名<實(shí)際類(lèi)型名>對(duì)象名(實(shí)參表);
如:?
Compare
Compare
5:如果在類(lèi)模板外定義成員函數(shù),應(yīng)寫(xiě)成類(lèi)模板形式:
template
函數(shù)類(lèi)型 類(lèi)模板名<虛擬類(lèi)型參數(shù)>::成員函數(shù)名(函數(shù)形參表){……}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章名稱(chēng):c++模板-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://chinadenli.net/article26/dejecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、品牌網(wǎng)站建設(shè)、電子商務(wù)、ChatGPT、網(wǎng)站內(nèi)鏈、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容