函數(shù)模板
在C++程序中疙渣,經(jīng)常能看到以 template<class T> 等形式的語(yǔ)句,這其實(shí)就是應(yīng)用了模板的知識(shí)叙赚,在C++中梨水,凡是出現(xiàn)了類(lèi)似的語(yǔ)句拭荤,我們都可以認(rèn)為是一種泛型化的編程,所謂泛型編程疫诽,就是指不再拘泥于某種特定類(lèi)型的變量來(lái)編寫(xiě)函數(shù)或類(lèi)舅世,而是隨著程序的需求,來(lái)自動(dòng)轉(zhuǎn)換成為程序需要的類(lèi)型奇徒,比如編寫(xiě)一個(gè)交換兩數(shù)的函數(shù)雏亚,不確定要交換的是兩個(gè)整形數(shù)還是兩個(gè)double型數(shù)據(jù),在這種情況下摩钙,就可以使用模板罢低,等到程序確定了要交換何種類(lèi)型的變量時(shí),再根據(jù)相應(yīng)情況轉(zhuǎn)換胖笛,如下所示:
template <class T>
void Swap(T x, T y)
{
T tmp = x;
x = y;
y = tmp;
}
首先网持,模板原型如下所示:
template <class 類(lèi)型參數(shù)名> //class 可用 typename 替換
在上個(gè)函數(shù)中,T 就成為了這里的類(lèi)型參數(shù)名长踊,在實(shí)際應(yīng)用時(shí)翎碑,如果 x 和 y 賦為 int 型,那么 T 就被轉(zhuǎn)換成 int 型之斯。
下面是返回?cái)?shù)組最大元素的函數(shù):
template <class T>
T FindMaxNum(T a[],int size)
{
T MaxNUm = a[0];
for(int i = 1;i < size; ++i)
if(MaxNUm < a[i])
MaxNUm = a[i];
return MaxNUm;
}
當(dāng)然,模板也可以有不同的類(lèi)型參數(shù)遣铝,比如:
template <class T1,class T2>
這樣可以有效避免參數(shù)類(lèi)型的二義性佑刷。
值得注意的一點(diǎn)是,函數(shù)模板是可以重載的酿炸,只要形參表不同即可瘫絮。
在學(xué)習(xí)C++的基礎(chǔ)課程時(shí),遇到了這么一個(gè)知識(shí)點(diǎn)填硕,如果程序調(diào)用了一個(gè)函數(shù)麦萤,編譯器將按照以下順序去匹配相應(yīng)的函數(shù)原型:
Step 1:尋找參數(shù)完全匹配的普通函數(shù)(即不是由模板實(shí)例化得到的函數(shù))
Step 2:尋找參數(shù)完全匹配的模板函數(shù)
Step 3:尋找實(shí)參經(jīng)過(guò)自動(dòng)類(lèi)型轉(zhuǎn)換后能夠匹配的普通函數(shù)
Step 4:上面的都無(wú)法匹配鹿鳖,則報(bào)錯(cuò)
類(lèi)模板
類(lèi)模板的使用方法與函數(shù)模板相差不大,但也有區(qū)別壮莹,類(lèi)模板要考慮的東西會(huì)更多翅帜,首先來(lái)看一下類(lèi)模板的聲明:
template <class 類(lèi)型參數(shù)1, 類(lèi)型參數(shù)2, ......>
class 類(lèi)模板名
{
成員函數(shù)和成員變量
};
如果成員函數(shù)在類(lèi)模板的外面定義時(shí),要寫(xiě)成如下格式:
template 型參數(shù)表
返回值類(lèi)型 類(lèi)模板名<類(lèi)型參數(shù)名列表>::成員函數(shù)名(參數(shù)表)
{
......
}
以下是一個(gè)實(shí)例:
#include <iostream>
using namespace std;
template<class T>
class Square
{
public:
T SideLength;
void input(T a);
void output(void);
};
int main()
{
Square<int> square; //寫(xiě)出參數(shù)類(lèi)型
square.input(5);
square.output();
return 0;
}
template<class T>
void Square<T>::input(T a) //成員函數(shù)寫(xiě)在外部時(shí)命满,要遵循這個(gè)格式
{
SideLength = a;
}
template<class T>
void Square<T>::output(void)
{
T a = SideLength;
cout << a*a << endl;
}