定義類模板的一般形式是:
template <類型名 參數名1,類型名參數名2,…>
class 類名
{
類聲明體
};
例如,template <class T>
class Smemory
{…
public:
void mput(T x);
…
}
表示定義一個名爲Smemory的類模板,其中帶類型參數T。
在類模板的外部定義類成員函數的一般形式是:
template <類型名 參數名1,類型名參數名2,…>
函數返回值類型 類名<參數名 1 參數名 2,…>::成員函數名(形參表)
{
函數體
}
例如:template <class T>
void Smemory<T>::mput(T x)
{…}
表示定義一個類模板Smemory的成員函數,函數名爲mput,形參x的類型是T,函數無返回值。
類模板是一個類家族的抽象,它只是對類的描述,編譯程序不爲類模板(包括成員函數定義)創建程序代碼,但是通過對類模板的實例化可以生成一個具體的類以及該具體類的對象。
與函數模板不同的是:函數模板的實例化是由編譯程序在處理函數調用時自動完成的,而類模板的實例化必須由程序員在程序中顯式地指定,
其實例化的一般形式是:
類名 <數據類型 1(或數據),數據類型 2(或數據)…> 對象名
例如,Smemory<int> mol;
表示將類模板Smemory的類型參數T全部替換成int 型,從而創建一個具體的類,並生成該具體類的一個對象mol。
下面舉例說明類模板的定義和使用方法。
例9.3.1:類模板的定義和使用。
#include <iostream.h>
#include <conio.h>
const int SIZE=8;
template <class T>
class Smemory { //定義類模板Smemory
T data[SIZE]; //類型爲T,長度爲SIZE的數組data[]爲數據成員
int count;
public:
Smemory( ){ count=0; }
void mput(T x); //mput()函數的參數x的類型是T
T mget( ); //聲明返回值類型爲T的成員函數mget()
};
template <class T>
void Smemory<T>::mput(T x) //定義成員函數mput(),函數的參數類型爲T,該函數用於爲數據成員 data數組的各個元素賦值
{
if(count==8) { cout<<"Memory is full"; return; }
data[count]=x;
count++;
}
template <class T>
T Smemory<T>::mget( ) //定義成員函數mget(),函數的返回類型爲T,該函數用於取出數據成員 data數組的各個元素
{
if(count==0) { cout<<"Memory is empty"; return 0; }
count--;
return data[count];
}
void main( )
{
Smemory<int> mo1;
int i; char ch='A';//將Smemory實例化,並創建對象mo1
Smemory<char> mo2; //將Smemory實例化,並創建對象mo2
for(i=0; i<8;i++)
{
mo1.mput(i); //調用成員函數mput()
mo2.mput(ch); ch++; //調用成員函數mput()
}
cout<<"Get mo1 => ";
for(i=0;i<8;i++)
cout<<mo1.mget( ); //調用成員函數mget()
cout<<"\nGet mo2 => ";
for(i=0;i<8;i++)
cout<<mo2.mget( ); //調用成員函數mget()
getch();
}
程序的運行結果是:
Get mo1=> 76543210
Get mo2=> HGFEDCBA
說明:類模板Smemory帶一個類型參數T,T是代表數據類型的參數,在類型參數前面必須加關鍵字class,用class表示類型參數的類型。在實例化時,對應類型參數T必須是具體的數據類型名,這裏建立第一個對象時數據類型名是int,表示將類模板Smemory中的所有類型參數T都替換成int型, 從而創建一個具體的類及其對象mo1;在建立第二個對象時數據類型名是char,表示將模板Smemory中的所有類型參數T都替換成char,從而創建一個具體的類及其對象mo2。
來源:http://jpk.sdju.edu.cn/cplus/kejian/content/chapter9/chapter9_3_2.htm