C++:模板
一,模板的概念。
引入模板的原因:
我們已經學過重載,對重載函數而言,C++的檢查機制能通過函數參數的不同及所屬類的不同。正確的調用重載函數。例如,為求兩個數的最大值,我們定義MAX()函數需要對不同的資料類型分別定義不同重載版本。
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);時 程式就會出錯,因為我們沒有定義char類型的重載版本。
現在,我們再重新審視上述的max()函數,它們都具有同樣的功能,即求兩個數的最大值,能否唯寫一套代碼解決這個問題呢?這樣就會避免因重載函數定義不全面而帶來的調用錯誤。為解決上述問題C++引入模板機制,模板定義:模板就是實現代碼重用機制的一種工具,它可以實作類別型參數化,即把類型定義為參數,從而實現了真正的代碼可重用性。模板分類:磨板分為函數模板後,當編譯系統發現了一個對應的函數調用事,將根據實參的類型來確認是否匹配函數模板中對應的形參然後產生一個重載函數,稱該重載函數為模板函數。函數模板與模板函數的區別: 二者區別可以類比 類與對象的區別。函數 模板與類相似是模板的定義,而模板函數與對象相似。是函數模板的執行個體,具有程式碼。佔用記憶體空間。同樣,在說明了一個類模板後,也可以建立類模板的執行個體即產生模板類。類模板與模板類的區別是:類模板是模板的定義,不是一個實在的類,模板類才是實實在在的類。
二、函數模板與模板憾事
函數模板的一般生命形式如下:
template
傳回型別 函數名(形參表)
{//函數定義體 }
說明: templarte是一個聲明模板的關鍵字,表示聲明一個模板關鍵字class不能省略,如果類型形參多餘一個 ,每個形參前都要加class <類型 形參表>可以包含基礎資料型別 (Elementary Data Type)可以包含類類型.
請看以下程式:
#include
template /*函數模板聲明*/
T min(T x , T y)
{if(x
else return y;}
void main( )
{ int n1=2,n2=10;
double d1=1.5,d2=5.6;
cout<<”較小整數:”<<min(n1,n2)<
cout<<”較小實數:”<
}
程式運行結果: 較小整數:2
較小實數:1.2
程式分析:main()函數中定義了兩個整型變數n1 , n2 兩個雙精確度類型變數d1 , d2然後調用min( n1, n2); 即執行個體化函數模板T min(T x, T y)其中T為int型,求出n1,n2中的最小值.同理調用min(d1,d2)時,求出d1,d2中的最小值.
可用表示函數模板執行個體化過程
函數模板min(x,y)
模板函數min(n1,n2)int型
模板函數min(d1,d2) double型
若main()函數中加一條cout<
程式將會出錯,原因是模板函數T的各參數之間必須保持完全一致的類型,並不具有隱式類型轉換功能.
三,類模板與模板類
1.定義一個類模板:
template
class類名{
//類定義......
};
其中,template是聲明各模板的關鍵字,表示聲明一個模板,模板參數可以是一個,也可以是多個,但應是抽象化的結果,不應是具體的(例int,float等)類型,成員函數的參數或傳回型別,前面要加上形參類型.
例如:定義一個類模板:
template
class myclass{T1 I;//
T2 j;//
Public:
Myclass(T1 a,T2 b)//
{I=a; j=b;}
void show( )
{cout<<”I=”<<”j=”<
在主函數中若定義了一模板類 myclass並且聲明一個類對象ob1(1 引用語句:myclassob(2,0.1);注意:myclass執行個體化了類模板,即將T1執行個體為int 類型,T2為double 類型,這樣我們就得到了一個模板類.然後就可以定義類對象ob1並初始化.
還可以定義另一個模板類如: myclass
可通過表示類模板與模板類的關係
類模板myclass
模板類myclass(int,double)
模板類nyclass
總結:函數模板是一類函數的抽象,代表了一類函數,這一類函數具有相同的功能,代表一 具體的函數,能被類對象調用,而函數模板絕不能被類對象調用.
類模板是對類的抽象,代表一類類,這些類具有相同的功能,但資料成員類型及成員函數傳回型別和形參類型不同.模板類是類模板類的執行個體.代表一具體的類,可以定義類對象 ,而不能給類模板定義對象