TemPlate (模板)
一. 函數模板(Function Template)
在C++裏,我們可以寫一個通用函數,使用非實例化的參數類型,該參數在函數被調用時進行實例化。這種函數稱爲函數模板。
以前我們實現一個函數的時候都會爲其寫一個獨自的方法去實現,就是把所有的代碼都寫在main函數裏,沒有任何封裝和模塊,這樣的程序編寫風格不是很好,沒有充分的實現代碼的複用。
eg:int iArray[max] = {10, 20, 30, 40, 50}; float fArray[max] = {1.1, 1.2, 1.3, 1.4, 1.5}; char *cArray[max] = {"one", "two", "three", "four","five"}; sx: for(int i =0;i<max;i++){ cout<<iArray[i]<<“ ”; } for(int i =0;i<max;i++){ cout<<fArray[i]<<“ ”; } for(int i =0;i<max;i++){ cout<<cArray[i]<<“ ”; }
還有一種實現的是對代碼的初步複用,就是寫一個輸出函數對數組進行輸出;
void printArray(int* array,int size); for(int i =0;i<max;i++){ cout<<iArray[i]<<“ ”; } printArray(array,max); void printArray(float* array,int size); void printArray(char** array,int size);
我們可以看到這個輸出函數的行爲是一樣的,只是操作的輸出類型不同而已.
現在我們使用函數模板寫一個通用的函數經行輸出操作。
首先我們看一下普通函數和函數模板的區別:
1.普通函數:參數值未定,但參數類型確定. 2.函數模板:不僅參數的值不確定,連參數的類型也不確定,這是一種更高級的複用.
template<class T> ———這就是函數模板的聲明
T是類型參數,T是一個未實例化的類型.T有可能是int,float,char*....
void printArray(T* array,int size){ for(int i =0;i<size;i++){ cout<<array[i]; } }
在調用函數模板時,對模板自動進行實例化,模板形參的類型取決於傳入的實參的類型。
main: printArray(iArray,max); //在這裏T被實例化爲int類型 printArray(fArray,max); //在這裏T被實例化爲float類型 printArray(cArray,max); //在這裏T被實例化爲char類型
總結:函數模板的作用就是把具有相同功能的函數寫成一個模板,這樣方便統一管理。
二.類模板 (class template)
通過函數模板我們可以看到,函數模板的參數是不同的;在這裏我們可能想到我們以前接觸到的許多類,這些類就是參數不同而已,在這裏我們可以寫一個基礎類模板,當一個對象聲明的時候,需要給出明確的類型。
函數模板:一個通用函數,可以操作多個類型。
類模板:僅僅是成員變量類型的不同,但是這些成員變量的操作(成員函數)類似.
類模板的聲明和實現必須在.h文件中完成。
template <class T>,T是一個類型,未知類型
T* stackPtr; //這裏使用的是模板T聲明成員函數; 在用int實例化後,可以視爲類聲明中所有的T用實例化的int類型來替換。
模板類的每個成員函數,都是模板函數; 實現時,每個成員函數前面,都要加上模板聲明.
template<class T> Stack<T>::Stack(int …) //對類的構造函數進行初始化,
main:
與函數模板自動實例化不同,函數模板是在調用的時候進行實例化。 而類模板必須在聲明該模板的對象時,明確的用指定類型對模板實例化。
//Stack<int> stack; //把模板T,實例化爲int類型。
模板參數也可以有默認值。
template<class T = int>模板參數的默認值,即具體的數據類型。
模板參數可以有多個。
(1)template<class T,class S>; (2)template<class T,int max_size>
T是參數化類型。max_size是非類型參數,已經確定類型的模板參數,非類型參數只能是整型,一般用於數組下標。