一、函式模板
- c++提供了函式模板(function template)。所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中的虛擬型別,從而實現了不同函式的功能。看下面的例子就清楚了。
- 【例4.7】將例4.6程式改為通過函式模板來實現。
#include using namespace std; template//模板宣告,其中t為型別引數 t max(t a,t b,t c) //定義乙個通用函式,用t作虛擬的型別名 int main( )
int main( )
然後呼叫它。後面兩行(14,15行)的情況類似。
型別引數可以不只乙個,可以根據需要確定個數。如:
template
可以看到,用函式模板比函式過載更方便,程式更簡潔。但應注意它只適用於函式的引數個數相同而型別不同,且函式體相同的情況,如果引數的個數不同,則不能用函式模板。
二、類模板
類模板與函式模板的定義和使用類似,我們已經進行了介紹,如果您對函式模板也感興趣,請檢視:
c++函式模板。
有時,有兩個或多個類,其功能是相同的,僅僅是資料型別不同,如下面語句宣告了乙個類:
class compare_int
int max( )
int min( )
float max( )
float min( )
numtype max( )
numtype min( )
numtype max( )
numtype min( )
//不能這樣定義類模板中的成員函式
而應當寫成類模板的形式:
template
numtype compare::max( )
上面第一行表示是類模板,第二行左端的numtype是虛擬型別名,後面的compare 是乙個整體,是帶參的類。表示所定義的max函式是在類compare 的作用域內的。在定義物件時,使用者當然要指定實際的型別(如int),進行編譯時就會將類模板中的虛擬型別名numtype全部用實際的型別代替。這樣compare 就相當於乙個實際的類。大家可以將例9.14改寫為在類模板外定義各成員 函式。
歸納以上的介紹,可以這樣宣告和使用類模板:
1) 先寫出乙個實際的類。由於其語義明確,含義清楚,一般不會出錯。
2) 將此類中準備改變的型別名(如int要改變為float或char)改用乙個自己指定的虛擬型別名(如上例中的numtype)。
3) 在類宣告前面加入一行,格式為:
template 如:
template //注意本行末尾無分號
class compare
; //類體
4) 用類模板定義物件時用以下形式:
類模板名《實際型別名》 物件名;
類模板名《實際型別名》 物件名(實參表列);
如:comparecmp;
comparecmp(3,7);
5) 如果在類模板外定義成員函式,應寫成類模板形式:
template 函式型別 類模板名《虛擬型別引數》::成員函式名(函式形參表列)
關於類模板的幾點說明:
1) 類模板的型別引數可以有乙個或多個,每個型別前面都必須加class,如:
template
class someclass
;在定義物件時分別代入實際的型別名,如:
someclassobj;
2) 和使用類一樣,使用類模板時要注意其作用域,只能在其有效作用域內用它定義物件。
3) 模板可以有層次,乙個類模板可以作為基類,派生出派生模板類。有關這方面的知識實際應用較少,本教程暫不作介紹,感興趣的同學可以自行學習
函式模板和類模板(C )
所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。函式模板和普通函式的區別 函式模板不允許自動型別轉化,普通函式能夠進行自動型別轉換 函式模板和普通函式在一起呼叫的規則 1 函式模板可以像普通函式一樣被過載 2 c 編譯器優先...
C 函式模板和類模板
一 函式模板 1.概念 實際是建立乙個模型,然後根據這個模板去例項化一些物件,它的函式型別和形參型別不具體指定,用乙個虛擬的型別來代表,這個通用的函式就稱為函式模板,只要是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需要在模板中定義一次,在呼叫函式時,編譯器會根據實參的型別對函式進行...
C 類模板和函式模板
1 類模板 include using namespace std 通用類模板 template classt1,class t2 通用模板 class compare 在這裡不能寫型別 template classt1,class t2 這裡必須寫 compare compare 類模板全特化 t...