本文講解了c++函式模板和類模板的相關知識,當需要多個函式對多個不同的資料型別的資料進行相同的處理時,需要多次過載函式,而使用函式模板,編譯器產生不同的目標**函式來適當地處理每個函式的呼叫,顯得更加簡便。將這一概念引入至類中,將類中資料成員的型別都引數化(把資料型別定義為引數),在初始化類物件的時候,根據實參確定資料型別。
二、函式模板
當需要函式用於執行相似的操作,這些操作處理不同資料型別上的相同程式邏輯,即函式要處理的資料型別不同,但程式邏輯一樣,那麼使用函式模板可以簡便地對函式進行過載,而不用進行多次過載。
例如求最大值的函式maximum(),如果要對int、float或double型的3個變數求出最大值,那麼將要過載函式2次以上,而使用函式模板可以使程式更簡潔。
#include using namespace std;
template//表示下面為一函式模板
t maximum( t value1 ,t value2 ,t value3)
int main()
其中template<>中的形參可以多個
例子如下:
#ifndef templateclass_h
#define templateclass_h
#include using std::cout;
using std::endl;
template< typename t1 ,typename t2 >
class classa
;#endif
template< typename t1 ,typename t2 > //注意再每個函式頭前均有此宣告語句
classa::classa(t1 v1 ,t2 v2 ) //建構函式
:a(v1),b(v2)
template< typename t1 ,typename t2 >
void classa::print() //print函式
可看出該類的成員函式均為模板函式,在main函式中初始化類物件時,編譯器將根據實參型別確定t1,t2的型別。
四、模板特化
如果我們想給模板函式(或類模板)實現乙個已確定資料型別的函式,那麼可以才用模板特化,當遇到該類資料型別的資料時,則呼叫該模板特化。特化分為全特化和偏特化,函式模板只有全特化,類模板有全特化和偏特化。
(1)函式模板特化
在前面提到的求最大值的函式maximum(),現在針對int型別寫一模板特化如下:
template<> //表明下面是乙個模板函式,由於針對int型,尖括號內省去
int maximum( int value1 ,int value2 ,int value3)
;template< typename t1 ,typename t2 >
class classa
; void print()
; void print()
; void print()
結果
五、非型別模版引數
非型別模板引數指定是在函式模板(或類模板)中,模板template<>,尖括號中的引數除了typename t(型別),還可增加常整數(包括列舉)或者指向外部鏈結物件的指標,浮點型float和類物件是不允許作為非型別模板引數的。示例如下:
此時maxsize相當於全域性變數的作用,但其為乙個常整數。
C 函式模板與類模板
一 函式模板 1 函式模板 建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬型別來代表這個通用函式來代表。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中虛擬的型別,從而實現不同函式的功能。作用 功能相同...
C 函式模板與類模板
由菜鳥網整理總結,整理文章 作者做的任務只是將知識點簡化更供人理解以及加了一些自己的認知。模版可以理解成把資料型別做成可以設定的引數化,然後在定義的時候套用,讓資料型別可以隨意變換。使用模板的目的就是能夠讓程式設計師編寫與型別無關的 比如編寫了乙個交換兩個整型int 型別的swap函式,這個函式就只...
C 函式模板與類模板
泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎.模板 函式模板 類模板 1.函式模板概念 函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。2.函式模板格式 template typename t1,typena...