模板就是實現(xiàn)代碼重用機制的一種工具,它可以實現(xiàn)類型參數(shù)化,即把類型定義為參數(shù), 從而實現(xiàn)了真正的代碼可重用性。模版可以分為兩類,一個是函數(shù)模版,另外一個是類模版。
一、函數(shù)模板函數(shù)的重載可以實現(xiàn)一個函數(shù)名多用,將是實現(xiàn)相同或類似功能的函數(shù)用一個函數(shù)名定義,雖然含義清楚,但仍要分別定義每一個函數(shù),為此,c++提供函數(shù)模板。建立一個通用函數(shù),其函數(shù)類型和形參類型不具體指定,用一個虛擬的類型來代表,這個通用函數(shù)就是函數(shù)模板。
#includeusing namespace stdl
template//模板聲明,T為類型參數(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<
上面就是一個簡單的模板函數(shù)。
不難看出,定義函數(shù)模板的一般形式為:
template函數(shù)定義
此外,typename可換成class。
template的含義即是模板,<>中先寫關(guān)鍵字typename(或class),后面跟一個類型參數(shù)T,T是一個虛擬的類型名 ,表明他是一個類型名但并未指明具體類型。從而,在函數(shù)定義是用T來定義的變量a,b,c也是未確定的。當(dāng)函數(shù)調(diào)用時,編譯器會根據(jù)實參的類型來確定T的類型。
class與typename作用相同,可以互換,但為了與類class區(qū)分,一般用typename。
需要注意的是,函數(shù)模板只適用于函數(shù)體相同,函數(shù)參數(shù)個數(shù)相同而數(shù)據(jù)類型不同的情況,如果參數(shù)個數(shù)不同,則不能使用函數(shù)模板。
二、類模板 1.與函數(shù)模板類似,有時,有兩個或多個類,其功能相同,僅僅是數(shù)據(jù)類型不同如下面聲明了一個類,用來比較兩個整數(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
但如果想對兩個浮點數(shù)作比較,還需要重新聲明一個類:
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功能,用來減少重復(fù)。?
2.類模板對于上面兩個類,可以聲明一個通用的模板,他可以有一個或多個虛擬的類型參數(shù)
template//聲明一個模板,虛擬類型名為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.聲明類模板要增加一行 template
可以這樣說類模板是類的抽象,類是類模板的實例。
類模板的使用類定義對象的方法:Compare_int com(4,7);? ,類模板定義對象與此類似,但不能直接寫Compare com(4,7);因為Compare只是類模板名,他不是一個具體的類,類模板中的類型numtype不是一個實際的類型,只是一個虛擬的類型,不能用來定義對象。因此,我們需要一個實際的類型名來取代虛擬類型 如下:
Compare
不難看出,其一般形式為:類模板名<實際類型名>對象名(參數(shù))
1:先寫出一個實際的類(如上面的Compare_int)
2:將此類準(zhǔn)備改變的類型名(如int改為float)改成虛擬類型名(如上面的numtype)
3:在類聲明前加一行
template
4:用類模板定義對象
類模板名<實際類型名>對象名;
類模板名<實際類型名>對象名(實參表);
如:?
Compare
Compare
5:如果在類模板外定義成員函數(shù),應(yīng)寫成類模板形式:
template
函數(shù)類型 類模板名<虛擬類型參數(shù)>::成員函數(shù)名(函數(shù)形參表){……}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧