本次引入類模板及其基本運算,為之后的一個關於棧的應用做鋪墊。
1.類模板的定義:
可用類模板來定義類,類模板是對象特性更為一般的抽象。簡而言之,一個類模板就是一個抽象的類、類模板的一般定義形式為:
template<參數名列表>
class 類名{
//類的說明
};
其中,template是關鍵字,<參數名列表>中可以有多個參數,多個模板參數之間用逗號分隔。模板參數的形式可以是:
class<標識符> 或 類型表達式<標識符>
如,可定義坐標點的類模板如下:
template <class T> //帶參數T的類模板說明
class Point{
public:
Point(T = 0,T = 0); //類的構造函數
Point(Point&); //類的復制構造函數
T Distance(Point&); //返回類型為T的成員函數
private:
T x,y;
};
2**.類模板的使用**:
使用上述模板定義對象iobj,並以int替換參數T:
Point<int> iobj(3,4); //該對象產生一個int型的點(3,4)
使用該模板再產生一個實例:
Point<double>dobj(7.8,8.8); //該對象產生一個double型的坐標點(7.8,8.8)
由此可見,使用類模板可以聲明不同類型的對象。對於一個可能用到多種數據類型的類來說,使用類模板可以大大提高編程的效率。簡單地說,如果你需要int型的數據,就用int來替換參數模板中的T,需要double型的數據就用double來替換參數模板中的T。
以下代碼給出了一個用類模板來描述坐標點的例子:
#include<iostream>
#include<cmath>
//The declaration of class template
template<class T>
class Point{ public: Point(T = 0,T = 0); Point(Point&); T Distance(Point&); private: T x,y; }; //The implementation of class template Point template<class T> Point<T>::Point(T a,T b):x(a),y(b){} template<class T> Point<T>::Point(Point& a) { x = a.x; y = a.y; } template<class T> T Point<T>::Distance(Point& a) { return sqrt((x - a.x)*(x - a.x) + (y - a.y)*(y - a.y)); } //main function int main() { using namespace std; //Learn the meaning of "namespace" from 《C++ primer》 Point<int>a1(3,4),a2(5,6); cout<<"The distance of these two points(int): "<<a1.Distance(a2)<<endl; Point<double>b1(7.8,9.8),b2(34.8,25.4); cout<<"The distance of these two points(double): "<<b1.Distance(b2)<<endl; return 0; }
下圖為運行結果:
顯然,使用類模板能使得我們在處理需要多種數據類型的類時游刃有余,從上述程序中我們也很容易發現類模板與普通的類之間的差別。其實,只要去掉類模板的聲明,並將T換成我們所需要的數據類型,再做些微小的改動就成為了一個普通的類。認識到這一點,對類模板的理解就會更加深刻。