函式與類模板
阿新 • • 發佈:2018-11-25
模板可以很好地實現程式碼重用,例如實現兩個數相加,不同的型別(int,float)相加就要寫多個相同功能的函式,導致程式碼不斷地重複,給程式碼維護與更新帶來了極大的困難,但是使用函式模板就可以完美的解決該問題,下面給出函式模板的使用例子。
函式模板的使用方法
template <class 形參名1,形參名2...>
返回型別 函式名(引數列表)
{函式體}
#include <iostream> using namespace std; template <class T> //宣告函式模板,T為引數型別, T add(T x,T y) //與普通函式類似,只不過是使用T代替了具體的資料型別(int float) { return (x+y); } int main() { int a=1.1,b=2.2; int c=add(a,b); //呼叫一次函式add,但是傳入的是int型別的形參,因此使用int代替T進行編譯 float e=1.1,f=2.2; float d=add(e,f);//呼叫一次函式add,但是傳入的是int型別的形參,因此使用float代替T進行編譯 cout<<c<<" "<<d<<endl;//使用同一個函式,穿入形同的引數,但是輸出結果截然不同 return 0; }
使用函式模板例項化的函式成為模板函式,如果模板函式還需要穿入兩個不同的型別的實參,那麼就要過載函式模板,例如:
template(class T,class D),就要定義兩個不同的引數名T、D
類模板的使用方法
與函式相同,類也是存在模板的,比如我們建立一個順序表(陣列是其中一種),那麼就存在不同資料型別的順序表,如果為每一種資料表都編寫一個類,那麼程式碼量就太多了,主要是大部分都是重複性的程式碼,我們可以使用模板類來解決程式碼重用性的問題。同樣的,在使用模板之前都要先宣告這是一個模板函式或者模板類
template <class 形參名1,class 形參名2...>
class 類名
{類的內容};
下面使用一個簡單的例子來說明
#include <iostream> using namespace std; template <class T> //宣告函式模板,T為引數型別, class SeqList { protected: T *data; //存放陣列 int maxSize;//順序表的最大表項資料 int last;//當前已存表項的最後位置(從0開始) public: SeqList(int sz=10); ~SeqList() { delete []data; } void input(); void output(); }; template<class T> SeqList<T>::SeqList(int sz) //建構函式函式體 { if(sz > 0) { maxSize = sz; last = -1; data = new T[maxSize]; if(data == NULL) {cerr<<"儲存分配錯誤"<<endl;exit(1);} } } template <class T> void SeqList<T>::input() //input函式體 { cout<<"Please list the number of elements in the input elements."<<endl; while(1) { cin>>last; if(last<=maxSize)break; cout<<"Element number is wrong."<<endl; } for(int i=0;i<=last;i++) { cout<<"please enter the "<<i+1<<"st element:"<<endl; cin>>data[i]; } } template <class T> //在類外實現每一個類成員函式之前都要宣告一下我這是一個模板函式,不然就是普通函數了 void SeqList<T>::output() //output函式體 { for(int i=0;i<=last;i++) cout<<"the"<<i+1<<"st element is:"<<data[i]<<endl; } int main() { SeqList<int> A; //在宣告一個SeqList的類物件的時候,一定要說明資料型別,相當於對T進行初始化吧 SeqList<char> B; A.input(); B.input(); A.output(); B.output(); return 0; }