函數模板使用泛型來定義函數,編譯時具體的類型代替泛型。模板又稱爲通用編程。
如果需要交換兩個int,float型變量,我們可以使用函數重載,如下所示。
#include<iostream>
using namespace std;
void Exchange(int &m,int &n);
void Exchange(float &m,float &n);
int main()
{
int a=1,b=2;
Exchange(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
float m=1.1,n=2.2;
Exchange(m,n);
cout<<"m="<<m<<endl;
cout<<"n="<<n<<endl;
return 0;
}
void Exchange(int &m,int &n)
{
int tem;
tem=m;
m=n;
n=tem;
}
void Exchange(float &m,float &n)
{
float tem;
tem=m;
m=n;
n=tem;
}
上述程序太冗雜,且易出錯;C++允許我們使用泛型編程,對於相同的操作,可以使用函數模板。上述程序使用函數模板後如下:
#include<iostream>
using namespace std;
template<class Type>
void Exchange(Type &m,Type &n);
int main()
{
int a=1,b=2;
Exchange(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
float m=1.1,n=2.2;
Exchange(m,n);
cout<<"m="<<m<<endl;
cout<<"n="<<n<<endl;
// float x=1.1;
// int y=2;
// Exchange(x,y); 該句無效
// cout<<"x="<<x<<endl;
// cout<<"y="<<y<<endl;
return 0;
}
template<class Type> // 此句可替換爲template<typename Type>
void Exchange(Type &m,Type &n)
{
Type tem;
tem=m;
m=n;
n=tem;
}
模板函數相比上個編程更加簡便,明瞭。
函數模板需要在前面加上語句"template <class T>",也可寫爲"template <typename T>";
class和typename後的形參名可按變量命名規則隨意取名;
在函數模板中,形參類型不是必須爲泛型,可以爲具體類型;void Exchange(Type &m,Type &n,int x)也是一個函數模板;
如果需要多個將同一種算法用於不同類型的函數,適合使用模板
注意:模板並不創建任何函數,只是告訴編譯器如何定義函數;當實參爲int時,int代替所有Type,按模板樣式創建函數。實參爲float時,float代替所有Type,按模板樣式創建函數,最終仍有兩個獨立的函數定義。
模板重載
對兩個數可以使用Exchange函數,但是對於兩個數組,上述模板函數不能對數組內數據進行交換。我們可以使用模板重載。
#include<iostream>
using namespace std;
template<class Type>
void Exchange(Type &m,Type &n);
template<class Type>
void Exchange(Type *m,Type *n,int sum);//sum爲數組內數據量大小
int main()
{
int a=1,b=2;
Exchange(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
float m=1.1,n=2.2;
Exchange(m,n);
cout<<"m="<<m<<endl;
cout<<"n="<<n<<endl;
// float x=1.1;
// int y=2;
// Exchange(x,y);
// cout<<"x="<<x<<endl;
// cout<<"y="<<y<<endl;
int x[6]={0,1,2,3,4,5};
int y[6]={5,4,3,2,1,0};
Exchange(x,y,6);
for(int i=0;i<6;i++)
cout<<x[i]<<" ";
cout<<endl;
for(int i=0;i<6;i++)
cout<<y[i]<<" ";
cout<<endl;
return 0;
}
template<class Type>
void Exchange(Type &m,Type &n)
{
Type tem;
tem=m;
m=n;
n=tem;
}
template<class Type>
void Exchange(Type *m,Type *n,int sum)
{
Type tem;
for(int i=0;i<sum;i++)
{
tem=m[i];
m[i]=n[i];
n[i]=tem;
}
}