函數模板就是功能類似的函數寫成統一的形式,可是函數的形參類型不一樣。ios
函數模板的定義:數組
template <class T>或者 template<typename T> 類型名 函數名 (參數名) {
函數體的定義
}
函數模板都是以關鍵字template 開始的,<>中的是類型參數表,每一個類型參數,例如上文的「T「,表明的是類型,能夠是內部類型(?,指的是函數內部嗎?)或者自定義類型,類型參數用來指定函數模板自己的形參類型和返回值類型,以及聲明函數中的局部變量(?,什麼意思?)。模板中的函數體的定義方式以普通函數定義形式相同。ide
函數模板使用實例以下:函數
#include<iostream> using namespace std; template<class T> //聲明函數模板 void outputArray(const *P_array, const int count )//定義函數體 { for(int i =0; i<count;i++) cout<<P_array[i]<<" "; cout<<endl; } int main() { const int aCount =8,cCount=20; int aArray[aCount]={1,2,3,4,5,6,7,8}; double bArray[ bCount ]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8}; char cArray[cCount]="Welcome to see you!"; cout <<"a Array contains:"<<endl; outputArray(aArray,aCount); cout <<"b Array contains:"<<endl; outputArray(bArray,bCount); cout <<"c Array contains:"<<endl; outputArray(cArray,cCount); }
分析:spa
函數模板中的聲明的類型參數T,表示抽象類型,當編譯器檢測到程序中調用函數模板outputArray時,便用outputArray的第一個實參的類型替換掉真個模板中定義的T,並創建用來輸出指定類型數組的一個完整函數,以後再編譯這個新函數。code
由此可知,模板函數與重載是密切相關的,從函數模板產生的相關函數都是同名的,編譯器用重載的方法調用相應的函數,另外函數模板自己也能夠用多種方式重載(?)。對象
類是對一組對象的公共性質的抽象,類模板則是對不一樣類的公共性質的抽象,所以類模板是更高層次的抽象。blog
類模板繼承
| <抽象>編譯器
類
| <抽象>
對象
由下到上這是對象,類,類模板三者之間的關係,對象經抽象獲得共同的性質,造成類,多個類又通過抽象獲得共同的性質獲得類模板。
類模板聲明的語法形式:
template <模板參數表> class 類名 { 類成員聲明 }
若是須要在類模板之外實現成員函數,須要採用如下形式:
template <模板參數表>
類型名 類名 <T>::函數名(參數表)
其中模板參數表能夠包括:
一、class(或者typename) 標識符
二、類型說明符 標識符 指明能夠接受一個由「類型說明符」所規定的類型的常量做爲參數。
當模板參數表同時包括上述多項內容時,個內容之間以逗號分隔,但(模板類的成員函數必須是函數模板,??)
這裏「模板參數表」中的參數與類模板聲明時「模板參數表」中的參數一一對應。系統會根據制定的參數類型和常量值生成一個類,而後創建該類的對象。也就是說,對模板進行實例化生成類,在對類實例化生成對象。可是類模板的實例化過程在程序中是隱藏的,不會出現。
使用模板類來創建對象時,形式以下:
模板<模板參數表> 對象名1,...,對象名n;
類模板的舉例:
template<class T>//類模板實現對任意類型數據進行存取 class Store { private: T item; //item用於存聽任意類型的數據 int haveValue;//標記item是被存入內容 public: Store(void); //默認形式的構造函數 T GetElement(); //提取數據函數 void PuElem(T x); //存入數據函數 }; //各成員函數的實現 template<class T> //默認形式的構造函數 Store<T>::Store():have Value(0) //由於是構造函數因此沒有返回值類 //型 {} //提取函數的實現 template<class T> T Store<T>::GetElement(void) { ////// } template <class T> void Store<T>::PutElem(T x) { haveValue++; item=x; } int main() { Store <int> S1,S2; Store<double> D; S1.PutElem(3); S2.PutElem(-7); }
這部分主要是爲了練習類繼承的實現形式練習。