數(shù)據(jù)類型也可以通過參數(shù)來傳遞预愤,在函數(shù)定義時可以不指明具體的數(shù)據(jù)類型,當發(fā)生函數(shù)調(diào)用時眼五,編譯器可以根據(jù)傳入的參數(shù)自動確定數(shù)據(jù)類型妆艘。這就是數(shù)據(jù)類型參數(shù)化。
函數(shù)模板
所謂函數(shù)模板看幼,實際上是建立一個通用函數(shù)批旺,其返回值類型和形參類型不具體指定,用一個虛擬的類型來代替(實際上是用一個標識符來占位)诵姜。這個通用函數(shù)就稱為函數(shù)模板(Function Template)汽煮。凡是函數(shù)體相同的函數(shù)都可以用這個模板來代替,不必定義多個函數(shù)棚唆,只需在模板中定義一次即可暇赤。在調(diào)用函數(shù)時系統(tǒng)會用實參的類型來取代模板中的虛擬類型,從而實現(xiàn)了不同函數(shù)的功能宵凌。
定義模板函數(shù)的語法為:
template<typename 數(shù)據(jù)類型參數(shù),typename 數(shù)據(jù)類型參數(shù),...> 返回值類型 函數(shù)名(形參列表){
//TODO:
//在函數(shù)體中可以使用數(shù)據(jù)類型參數(shù)
}
eg:
template <typename T> T sum(T a, T b){
T temp = a + b;
return temp;
}
模板類
假如我們現(xiàn)在要定義一個類來表示坐標鞋囊,要求坐標的數(shù)據(jù)類型可以是整數(shù)、小數(shù)和字符串瞎惫,例如:
x = 10溜腐、y = 10
x = 12.88坯门、y = 129.65
x = "東京180度"、y = "北緯210度"
坐標 x 和 y 的數(shù)據(jù)類型不確定逗扒,借助模板類古戴,就可以將數(shù)據(jù)類型參數(shù)化,否則就要定義多個類矩肩。
這個時候就可以使用模板類现恼,請看下面的代碼:
template?<typename T1,typename T2> //這里不能有分號
class Point{
private:
T1 x;
T2 y;
public:
Point(T1 _x, T2 _y): x(_x),y(_y){}
T1 getX();
void setX(T1 x);
T2 getY();
void setY(T2 y);
};
上面是類的聲明,還需要在類外定義成員函數(shù)黍檩。在類外定義成員函數(shù)時仍然需要帶上模板頭叉袍,語法為:
template<類型參數(shù)列表> 函數(shù)返回值類型 類名<類型參數(shù)列表>::函數(shù)名(參數(shù)列表){
//TODO:
}
template<typename T1,typename T2>
T1 Point<T1 , T2>::getX(){
return x;
}
template<typename T1,typename T2>
void Point<T1 , T2>::setX(T1 x){
this->x = x;
}
template<typename T1,typename T2>
T2 Point<T1 , T2>::getY(){
return y;
}
template<typename T1,typename T2>
void Point<T1 , T2>::setY(T2 y){
this->y = y;
}