如同函式模板一樣,使用類模板使使用者可以為類定義一種模式,使得類中的某些資料成員、某些成員函式的引數、某些成員函式的返回值能取任意型別。類模板是對一批僅僅成員資料型別不同的類的抽象,程式設計師只要為這一批類所組成的整個類家族建立乙個類模板,給出一套程式**,就可以用來生成多種具體的類,(這類可以看作是類模板的例項),從而大大提高程式設計的效率。
定義類模板的一般形式是:
template 《型別名 引數名1,型別名引數名2,…>
class 類名
;例如,
template
class smemory
表示定義乙個名為smemory的類模板,其中帶型別引數t。
在類模板的外部定義類成員函式的一般形式是:
template 《型別名 引數名1,型別名引數名2,…>
函式返回值型別 類名《引數名 1 引數名 2,…>::成員函式名(形參表)
例如:template
void smemory::mput(t x)
表示定義乙個類模板smemory的成員函式,函式名為mput,形參x的型別是t,函式無返回值。
類模板是乙個類家族的抽象,它只是對類的描述,編譯程式不為類模板(包括成員函式定義)建立程式**,但是通過對類模板的例項化可以生成乙個具體的類以及該具體類的物件。
與函式模板不同的是:函式模板的例項化是由編譯程式在處理函式呼叫時自動完成的,而類模板的例項化必須由程式設計師在程式中顯式地指定,
其實例化的一般形式是:
類名 《資料型別 1(或資料),資料型別 2(或資料)…> 物件名
例如,smemorymol;
表示將類模板smemory的型別引數t全部替換成int 型,從而建立乙個具體的類,並生成該具體類的乙個物件mol。
/*類模板,但是在類外定義成員函式的時候,需要使用函式模板
*/#include
using
namespace
std ;
template
<
class
t>
class
base
t geta()
//類內定義
void
seta(t c);
};
template
<
class
t>
//模板在類外的定義
void
base::seta(t c)
intmain(
void
)
函式模板的寫法
函式模板的一般形式如下:
template
返回型別 函式名(形參表)
說明: template是乙個宣告模板的關鍵字,表示宣告乙個模板關鍵字class不能省略,如果型別形參多餘乙個 ,每個形參前都要加class 《型別 形參表》可以包含基本資料型別可以包含類型別。
請看以下程式:
[cpp]view plain
copy
#include
using
std::cout;
using
std::endl;
//宣告乙個函式模版,用來比較輸入的兩個相同資料型別的引數的大小,class也可以被typename代替,
//t可以被任何字母或者數字代替。
template
<
class
t>
t min(t x,t y)
void
main( )
程式執行結果:
模板類和過載函式一起使用
兩者一起使用時,先考慮過載函式,後考慮模板類,如過再找不到,就考慮型別轉換,可能會帶來精度的變化。
[cpp]view plain
copy
#include "iostream"
using
namespace
std ;
//函式模板
template
<
class
t>
const
t max(t a , t b)
intmax(
intx ,
inty)
intmax(
char
x ,
inty)
intmax(
intx ,
char
y)
intmain(
void
)
c 模板類學習
1 模板的概念 我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義max 函式需要對不同的資料型別分別定義不同過載 overload 版本。函式1.int max int x,int y ...
c 模板類學習
1 模板的概念 我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義max 函式需要對不同的資料型別分別定義不同過載 overload 版本。函式1.int max int x,int y ...
c 模板類學習
1 模板的概念 我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義max 函式需要對不同的資料型別分別定義不同過載 overload 版本。函式1.int max int x,int y ...