c++中的模板貌似在java中沒有,但是java有泛型,不知道c++有沒有,後面會繼續學習。模板的意思,就是說有一個原型,使用的時候只要按照原型的定義使用即可。是原型哦,可不是類型,所以模板把類型複雜的問題給解決了。這裏有必要說一下函數重載,函數重載是針對同樣的函數名,我們定義不同類型的形參,針對不同的形參,實現不同的函數邏輯。但是模板呢?是針對所有的類型,我們定義一個函數即可。這樣的話,也就是說模板,只有一個函數定義,針對多種類型進行同樣的邏輯處理。
模板,分爲兩種,函數模板和類模板。早就聽說了c++模板功能強大。現在證實一下。
函數模板
函數模板的定義使用如下格式即可:
template <class T> T getMax(T t1,T t2)
這樣,在使用的時候,我們直接實現該函數的邏輯即可,避免了對類型的處理,如果T是對象類型腫麼辦,那麼需要操作符重載了來實現特有邏輯了。看看下面的代碼:
#include <iostream>
using namespace std;
template <class T> T getMax(T t1,T t2);
template <class T> T getMin(T t1,T t2);
template <class T,class U> T sum(T t1,U u1);
int main()
{
int a=1,b = 2,c;
double d1 = 1.2, d2 = 1.3;
c = getMax(a,b);
cout << c << endl;
c = getMin(a,b);
cout << c << endl;
cout << sum(a,d1) << endl;
return 0;
}
template<class T> T getMax(T t1,T t2)
{
if(t1 > t2)
return t1;
return t2;
}
template <class T> T getMin(T t1,T t2)
{
if(t1 > t2)
return t2;
return t1;
}
template <class T,class U> T sum(T t1,U u1)
{
return t1+u1;
}
在這裏我們定義了取最大值,最小值,加法運算的函數。每一個聲明或定義之前,都需要加上模板的定義纔可以。另外,針對sum函數,之所以有T,U,是說sum函數可以同時傳入兩種不同類型的實參。返回值是T,當然,我們可以根據需要,寫成U也可以啦。看看運行結果的截圖吧,結果爲什麼會這樣,我就不說了。
類模板
#include <iostream>
using namespace std;
template <class T1,class T2>
class base
{
private:
T1 x;
T2 y;
public:
base();
base(T1 a,T2 b);
show();
};
template <class T1,class T2>
base<T1,T2>::base()
{
x = 1;
y = 2;
}
template <class T1,class T2>
base<T1,T2>::base(T1 a,T2 b)
{
x = a;
y = b;
}
template <class T1,class T2>
base<T1,T2>::show()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
int main()
{
base<int,int> *t = new base<int,int>(5,10);
t->show();
delete t;
return 0;
}
上面的代碼定義了一個base類,base類中有兩個私有成員變量,變量的類型是不確定的,模板化的。同樣,在構造函數中,也可以使用模板化的參數。需要注意的是,我們在實現每個類的方法時,需要將每個方法前都加上模板化的聲明。我們看看這個代碼的執行結果吧: