C 函式模板和類模板

2021-06-28 20:14:10 字數 1933 閱讀 7574

一、函式模板

- 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...