模板(template)利用一種完全通用的方法來設計函數或類而不必預先說明將被使用的每個對象的類 型,利用模板功能可以構造相關的函數或類的系列,因此模板也可稱為參數化的類型。在C++語言中,模 板可分為類模板(class template)和函數模板(function template)。
在程序中說明了一個函 數模板後,編譯系統發現有一個相應的函數調用時,將根據實參中的類型來確認是否匹配函數模板中對應 的形參,然後生成一個重載函數。該重載函數的定義體與函數模板的函數定義體相同,稱之為模板函數( template function)。
函數模板與模板函數的區別是:函數模板是模板的定義,定義中用到通用 類型參數。模版函數是實實在在的函數定義,它由編譯系統在遇到具體函數調用時所產生,具有程序代碼 。
同樣,在說明了一個類模板之後,可以創建類模板的實例,即生成模板類。
類模板與摸 板類的區別是:類模板是模板的定義,不是一個實實在在的類,定義中用到通用類型參數;模板類是實實 在在的類定義,是類模板的實例。
1.函數模板
通過前面知識的學習可知,在所定義的函數 中,函數形參的類型是固定的,當調用函數時,實參的類型要與被調函數的形參類型保持一致,否則會出 現類型不一致的錯誤。因此,對於功能相同而只是參數的類型不同的情況,也必須定義不同的函數來分別 完成相應的功能,這顯然是很不靈活的。
C++語言中提供的函數模板功能就是為解決以上問題而提 出的。C++語言提供的函數模板可以定義一個對任何類型變量都可進行操作的函數,從而大大增強了函數 設計的通用性。因為普通函數只能傳遞變量參數,而函數模板卻提供了傳遞類型的機制。
在C++語 言中,使用函數模板的方法是先說明函數模板,然後實例化成相應的模板函數進行調用執行。
函 數模板的一般說明形式如下:
template <類型形參表>
返回值類型 函數名(形參表 )
{
//函數定義體
}
在上面的定義形式中,<參數形參表>可以有一到 若干個形參,各形參前必須加上class關鍵字,表示傳遞類型,當有多個形參時,各形參間用逗號分隔。 從中可以看出,<類型形參表>中的每個形參就表示了一種數據類型。“形參表”中至少 有一個形參的類型必須用<類型形參表>中的形參來定義。
函數模板只是說明,不能直接執 行,需要實例化為模板函數後才能執行。當編譯系統發現有一個函數調用:函數名(實參表);時,將根 據“實參表”中的實參的類型和已定義的函數模板生成一個重載函數即模板函數。該模板函數 的定義體與函數模板的定義體相同,而“形參表”中的類型則以“實參表”中的實 際類型為依據。
2.類模板
類模板實際上就是函數模板的推廣。
說明類模板的一般 格式為:
template <類型形參表>
class 類模板名
{
private:
私有成員定義
protected:
保護成員定義
public:
公有成員定義
};
(1)<類型形參表>中可以包括一到若干個形參,這些形參既可以是“類 型形參”,也可以是“表達式形參”。每個類型形參前必須加class關鍵字,表示對類模 板進行實例化時代表某種數據類型,也就是說,類型形參是在類模板實例化時傳遞數據類型用的;表達式 形參的類型是某種具體的數據類型,當對類模板進行實例化時,給這些參數提供的是具體的數據,也就是 說,表達式形參是用來傳遞具體數據的。當<類型形參表>中的參數有多個時,需用逗號隔開。如:
template <class arg1,int arg2,class arg3>
class myclass
{
//類的定義體
};
此處定義的類模板名是myclass,它有三個參數arg1、arg2和 arg3,其中arg1和arg3是類型形參,在類模板實例化時用於傳遞數據類型,arg2是表達式形參,用於在類 模板實例化時傳遞具體數據。
(2)類模板中成員函數可以放在類模板的定義體中(此時與類中的 成員函數的定義方法一致)定義,也可以放在類模板的外部來定義,此時成員函數的定義格式如下:
template <類型形參表>
函數值的返回來性 類模板名<類型名表>::成員函 數(形參)
{ 函數體 }
其中:類模板名即是類模板中定義的名稱;
類型名表 即是類模板定義中的<類型形參表>中的形參名。
(3)類模板定義只是對類的描述,它本身 還不是一個實實在在的類,是類模板。
(4)類模板不能直接使用,必須先實例化為相應的模板類 ,定義模板類的對象(即實例)後,才可使用。可以用以下方式創建類模板的實例。
類模板名 <類型實參表> 對象名表;
此處的<類型實參表>要與該模板中的<類型形參表> 匹配,也就是說,實例化中所用的實參必須和類模板中定義的形參具有同樣的順序和類型,否則會產生錯 誤。
相關文章
C++學習摘要之二:構造函數和析構函數
http://www.bianceng.cn/Programming/cplus/200911/12302.htm
C++學習摘要之一:類和對象
http://www.bianceng.cn/Programming/cplus/200911/12301.htm