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