什麼是模板?模板在生活中用處很大,類似流水線作用,手機外殼的製作等方方面面都離不開模板,如果沒有模板,什麼東西都是一件一件做出來,效率就很低下。
1.模板函數
在C++中如果我們要實現一個函數類似 swap函數用來交換兩個傳入的參數的值參數的類型分別爲int,long,double,可以考慮用函數的重載,三個函數,因爲功能很簡單,這裏就不寫了。
但是這種代碼實現的方式十分的臃腫,我們可以考慮用函數模板來重載,
函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生函數的特定
類型版本
格式
template<class T1,class t2,class t3……>
返回值類型 函數名 (參數列表)
{
}
函數重載的具體例子如下:
template<class T>
T Swap( T& a, T& b)
{
T tem = a;
a = b;
b = tem;
return 0;
}
注意以下幾點
- 參數列表裏的class可以用typename來替代,但是不能用struct來替代
- 注意傳入參數的類型,假如傳入上面Swap函數裏的兩個參數類型不同,編譯器無法確定用哪個替代T,會報錯,除此之外,和普通函數用法相同。
3.假如有一個模板函數和一個普通同名函數,傳遞的參數符合,程序會調用普通函數,如果模板函數會產生更符合的函數,會調用模板函數
例如同時存在Swap模板函數和普通Swap函數
template<class T1,class T2>
T Swap( T1& a, T2& b)
int Swap(int&,int&);
int a,b;
Swap(a,b);//調用普通函數,因爲普通函數參數符合
int c;
long d;
Swap(c,d);//調用模板函數,雖然long能隱式轉化成int,但是模板函數能產生更符合條件的函數
和普通函數不同,模板函數不允許隱式轉化。
2.模板類
有了模板函數,以此類推也有模板類,格式爲
template<class T1, class T2, ..., class Tn>
class 類模板名
{
// 類內成員定義
}
注意1.模板類的每個函數如果在類外實現需要類後加模板參數列表和類模板的聲明
template<class T>
T test<T>::Swap(T &a,T& b)
{
T tem = a;
a = b;
b = tem;
return 0;
}
注意2:模板類的實例化需要模板類的名字後加是<實例化需要的類型>加對象名字,如↓
test<int> s1;
模板類並不是真正的類,而是編譯器根據需要生成實例類的工具👁