函數模板和類模板
先講函數模板:
函數模板,顧名思義,就是一類相似的函數的模板,用這個模板實現的函數就叫做模板函數。
定義形式:
template<模板參數表> /*裏面需要有關鍵字class或者typename兩者都可以用*/
<返回值類型> <函數名> (模板參數形參表)
{
//函數模板定義體
}
實例1:基本關鍵字,語法的規範調用,比較兩數的大小
template<typename T>
void display<T a,T b>
{
max=(a>b)?a:b;
cout<<max<<endl;
}
/*調用:*/
display(3);
實例二:帶兩個參數
template<typename T,class C>
void display<T t,C c>
{
cout<<t<<endl<<c<<endl;
}
實例三:除了傳參數,還可以傳變量
template<typename T,int size>
void display(T a)
{
for(int i=0;i<size,i++)
{
cout<<a<<endl;
}
}
實際的應用:一個比較不同類型的大小的函數,如果用重載函數的話,需要寫很多個重複的,只是類型不同的函數,而使用函數模板實例化出來模板函數,就可以將類型作爲參數,那樣就可以省掉很多代碼量;
如:
template<typename T>
T max(T a,T b)
{
return(a>b)?a:b;
}
/*實際調用*/
int ival=max(100,99);
char cval=max<char>('A','B');
**
- 注意點:1.採用模板參數T的各參數之間必須保持完全一致的類型,模板類型並不具有隱式的類型轉換,例如,在int與char之間,在float與int之間,float與double之間等的類型轉換
- 模板函數與重載函數,優先調用重載函數,不匹配再調用模板函數,不匹配再強制類型轉換,再不匹配則throw出錯誤;
**
再講類模板
出現原因:由於某些類中的數據成員或者成員函數的參數因某些需求可能導致類型不同,但是,類中的成員函數的實現方式幾乎一樣,爲了避免代碼重用,使用類模板就可以傳進去不同的我們需要的參數類型。於是,類模板就從程序員手中蹦出來了。
語法形式:
template<class 類屬參數1,typename 類書參數2,...>
class NameofClassTemplate
{
/*這裏寫類的定義代碼;*/
public:
void display(){...}
private:
T *m_pArr;
}
/*類外成員函數定義*/
template<class T> /*每一個成員函數的類外定義都必須寫上*/
void MyArray<T>::display()
{
}
注意:模板代碼不能分離編譯 (不能將聲明和定義分開,即分開.h文件和.cpp文件;必須將所有代碼都寫在.h文件中)
實例:
template<typename T,int kSize,int kVal>
class MyArray
{
public:
MyArray();
~MyArray(){
delete []m_pArr;
m_pArr=NULL;
}
void display();
private:
T *m_pArr;
}
template<typename T,int kSize,int kVal>
MyArray<T,kSize,kVal>::MyArray()
{
m_pArr=new T[kSize];
for(int i=0;i<kSize;i++)
{
m_pArr[i]=kVal;
}
}
template<typename T,int kSize,int kVal> /*每一個類外成員函數的實現都必須寫*/
void MyArray<T,kSize,kVal>::display()
{
for(int i=0;i<kSize;i++)
{
cout<<m_pArr[i]<<endl;
}
}
/*實現*/
MyArray<int,5,6> arr;
arr.display();
總結,上面所寫的內容即爲複習所得,沒有涉及到很深的內容,只是包含了簡單的定義和使用方法,日後遇到再補充
內容參考:c++語言程序設計教程與實驗 清華大學出版社 第三版
慕課網:James大大的c++課程遠征之模板篇