C++模板函數和模板類的詮釋

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是非類型參數,已經確定類型的模板參數,非類型參數只能是整型,一般用於數組下標。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章