C++ - 模板
阿新 • • 發佈:2020-10-10
說明
-
模板雖然通用性很強,但是不能直接使用,它只是一個框架;並且並不是萬能的。(可以比喻成我們做PPT的時候)
-
泛型程式設計主要利用的技術就是模板。
-
C++提供兩種模板機制:函式模板、類模板。
函式模板作用
建立一個通用函式,其函式返回值型別和形參型別可以不具體制定,用一個虛擬的型別來代表。
比如:
void func(int x)
變成
T func(T x)
模板語法
寫一個函式模板(函式模板的語法):
template<typename/class T>
函式宣告或定義
-
template:宣告建立模板
-
typename/class:表面其後面的符號是一種資料型別,可以用class代替
-
T-:通用的資料型別,名稱可以替換,通常為大寫字母
-
函式模板利用關鍵字template
-
使用函式模板有兩種方式:自動型別推導、顯示指定型別
-
模板的目的是為了提高複用性,將型別引數似
什麼時候會用到模板?舉例
首先,我們不考慮c++中的內建函式;然後交換兩個數,這兩個數可能是int、double、short等。如果我們不同資料型別都要寫一個函式的話,那麼將會非常多。所以這時候我們就需要用到模板。
template<typename T> void swapp(T &x,T &y) { T tmp=x; x=y; y=tmp; } int xx=1,yy=10; // 使用模板交換 // 方法一:自動型別推導 swapp(xx,yy); //方法二:顯示指定型別 swapp<int>(xx,yy); //這裡的int是指定T的資料型別
注意事項:
- 自動型別推導,必須推匯出一致的資料型別T,才可以使用
- 模板必須要確定出T的資料型別,才可以使用I
第二點錯誤示範程式碼:
template<typename T>
void w()
{
cout<<"****"<<end;
}
int main()
{
w(); // 會報錯
// 正確:隨便給一個數據型別讓w可以執行起來
// w<int>(); 正確
return 0;
}
普通函式與函式模板區別
-
普通函式呼叫時可以發生自動型別轉換(隱式型別轉換)
-
函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換
-
利用顯示指定型別的方式,可以發生隱式型別轉換
#include<bits/stdc++.h>
using namespace std;
template<typename T>
T add(T a,T b)
{
return a+b;
}
int w(int a,int b)
{
return a+b;
}
int main()
{
int a=1,b=2;
char c='a'; // ASCII=97
cout<<w(a,b)<<endl; // 3
cout<<w(a,c)<<endl; // 98
cout<<add(a,b)<<endl; // 3
// cout<<add(a,c)<<endl; 這條語句這裡會報錯 如果是兩個char就不會報錯 嗎?
//函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換
//不同型別利用模板,必須需要指定型別
cout<<add<int>(a,b)<<endl; // 3
cout<<add<int>(a,c)<<endl; // 98
return 0;
}
普通函式與函式模板的呼叫規則
-
如果函式模板和普通函式都可以實現,優先呼叫普通函式
-
可以通過空模板引數列表( w<>(x,y) )來強制呼叫函式模板
-
函式模板也可以發生過載
4.如果函式模板可以產生更好的匹配,優先呼叫函式模板
說明一下:如果提供了函式模板,最好就不要提供普通函式,否則容易出現二義性。