一,模板的概念。
引入模板的原因:
我們已經(jīng)學(xué)過(guò)重載,對重載函數而言,C++的檢查機制能通過(guò)函數參數的不同及所屬類(lèi)的不同。正確的調用重載函數。例如,為求兩個(gè)數的最大值,我們定義MAX()函數需要對不同的數據類(lèi)型分別定義不同重載版本。
Int max(int x,int y);
{return(x>y)?x:y ;
}
float max( float x,float y){
return (x>y)? x:y ;}
double max(double x,double y)
{return (c>y)? x:y ;}
但如果在主函數中,我們分別定義了 char a,b;
在執行max(a,b);時(shí) 程序就會(huì )出錯,因為我們沒(méi)有定義char類(lèi)型的重載版本。
現在,我們再重新審視上述的max()函數,它們都具有同樣的功能,即求兩個(gè)數的最大值,能否只寫(xiě)一套代碼解決這個(gè)問(wèn)題呢?這樣就會(huì )避免因重載函數定義不全面而帶來(lái)的調用錯誤。為解決上述問(wèn)題C++引入模板機制,模板定義:模板就是實(shí)現代碼重用機制的一種工具,它可以實(shí)現類(lèi)型參數化,即把類(lèi)型定義為參數,從而實(shí)現了真正的代碼可重用性。模板分類(lèi):模板分為函數模板后,當編譯系統發(fā)現了一個(gè)對應的函數調用時(shí),將根據實(shí)參的類(lèi)型來(lái)確認是否匹配函數模板中對應的形參然后生成一個(gè)重載函數,稱(chēng)該重載函數為模板函數。函數模板與模板函數的區別: 二者區別可以類(lèi)比類(lèi)與對象的區別。函數模板與類(lèi)相似是模板的定義,而模板函數與對象相似。是函數模板的實(shí)例,具有程序代碼。占用內存空間。同樣,在說(shuō)明了一個(gè)類(lèi)模板后,也可以創(chuàng )建類(lèi)模板的實(shí)例即生成模板類(lèi)。類(lèi)模板與模板類(lèi)的區別是:類(lèi)模板是模板的定義,不是一個(gè)實(shí)在的類(lèi),模板類(lèi)才是實(shí)實(shí)在在的類(lèi)。
二、函數模板與模板憾事
函數模板的一般聲明形式如下:
template<class類(lèi)型形參表>//各個(gè)參數用逗號隔開(kāi),都要有關(guān)鍵字,關(guān)鍵字還可以用typename(建議使用)
返回類(lèi)型 函數名(形參表)
{//函數定義體 }
說(shuō)明: template是一個(gè)聲明模板的關(guān)鍵字,表示聲明一個(gè)模板關(guān)鍵字class不能省略,如果類(lèi)型形參多于一個(gè) ,每個(gè)形參前都要加class <類(lèi)型 形參表>可以包含基本數據類(lèi)型可以包含類(lèi)類(lèi)型.
請看以下程序:
#include<iostream.h>
template<class T> /*函數模板聲明*/
T min(T x , T y)
{if(x<y ) return x;
else return y;}
void main( )
{ int n1=2,n2=10;
double d1=1.5,d2=5.6;
cout<<”較小整數:”<<min(n1,n2)<<endl;//實(shí)例化min模板函數比較兩整數
cout<<”較小實(shí)數:”<<min(d1,d2)<<endl;// 實(shí)例化min模板函數比較兩雙精度數
}
程序運行結果: 較小整數:2
較小實(shí)數:1.2
程序分析:main()函數中定義了兩個(gè)整型變量n1 , n2 兩個(gè)雙精度類(lèi)型變量d1 , d2然后調用min( n1, n2); 即實(shí)例化函數模板T min(T x, T y)其中T為int型,求出n1,n2中的最小值.同理調用min(d1,d2)時(shí),求出d1,d2中的最小值.
可用下圖表示函數模板實(shí)例化過(guò)程
函數模板min(x,y)
模板函數min(n1,n2)int型
模板函數min(d1,d2) double型
若main()函數中加一條cout<<min(n1,d1)<<endl;
程序將會(huì )出錯,原因是模板函數T的各參數之間必須保持完全一致的類(lèi)型,并不具有隱式類(lèi)型轉換功能.
三,類(lèi)模板與模板類(lèi)
1.定義一個(gè)類(lèi)模板:
template<class類(lèi)型形參表>
class類(lèi)名{
//類(lèi)定義......
};
其中,template是聲明各模板的關(guān)鍵字,表示聲明一個(gè)模板,模板參數可以是一個(gè),也可以是多個(gè),但應是抽象化的結果,不應是具體的(例int,float等)類(lèi)型,成員函數的參數或返回類(lèi)型,前面要加上形參類(lèi)型.
例如:定義一個(gè)類(lèi)模板:
template<classT1,classT2>
class myclass{T1 i;//
T2 j;//
Public:
Myclass(T1 a,T2 b)//
{i=a; j=b;}
void show( )
{cout<<”i=”<<”j=”<<j<<endl;}};
在主函數中若定義了一模板類(lèi) myclass<int,double>并且聲明一個(gè)類(lèi)對象ob1(1 引用語(yǔ)句:myclass<int,double >ob(2,0.1);注意:myclass<int,double>實(shí)例化了類(lèi)模板,即將T1實(shí)例為int 類(lèi)型,T2為double 類(lèi)型,這樣我們就得到了一個(gè)模板類(lèi).然后就可以定義類(lèi)對象ob1并初始化.
還可以定義另一個(gè)模板類(lèi)如: myclass<double ,char>
可通過(guò)下圖表示類(lèi)模板與模板類(lèi)的關(guān)系
類(lèi)模板myclass<T1,T2>
模板類(lèi)myclass(int,double)
模板類(lèi)nyclass<double,char>
總結:函數模板是一類(lèi)函數的抽象,代表了一類(lèi)函數,這一類(lèi)函數具有相同的功能,模板函數代表具體的函數,能被類(lèi)對象調用,而函數模板絕不能被類(lèi)對象調用.
類(lèi)模板是對類(lèi)的抽象,代表一類(lèi)類(lèi),這些類(lèi)具有相同的功能,但數據成員類(lèi)型及成員函數返回類(lèi)型和形參類(lèi)型不同.模板類(lèi)是類(lèi)模板類(lèi)的實(shí)例.代表一具體的類(lèi),可以定義類(lèi)對象 ,而不能給類(lèi)模板定義對象.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。