所謂模板,是c++中實現多型的又一方法。我們已經知道函式過載可以實現多型,讓乙個函式名多用。這樣可以簡化函式的呼叫形式,但是又必須定義每乙個函式。
c++提供模板正是為了簡化這乙個過程。
首先,讓 我們寫乙個add函式
int add(int x,int y)
ok,現在我們要對add函式進行過載
char add(char x, char y)
我們新定義了乙個日期型別date,我們又得對date進行過載
date add(date& d1, date &d2)
額,我們為什麼如此的粗心。。。把「+」寫成了「-」
這樣的話,我們需要修改所有過載函式的邏輯。這就是函式過載的缺點。
雖然只需要把所有的加號換過來就好了,可是由於我們寫的是非常簡單的函式(只有一條返回語句)。當我們寫了很長很長的語句時,這就會有很大的工作量了
函式過載的缺點:
(1)每當需要新的型別出現後,需要過載對應新增的函式
(2)函式過載的各個函式,大體函式邏輯一樣,只是改變了型別。導致**的利用率不高。
(3)當邏輯出現問題時,需要修改所有過載的函式。不方便維護
(4)函式過載無法解決返回值的問題
由於函式過載的諸多缺點,我們引入了【泛型程式設計】的概念。所謂的【泛型程式設計】,就是編寫與型別無關的**,是提高**復用的一種手段。
而泛型程式設計,又包括【函式模板】和【類模板】。模板是泛型程式設計的基礎!
關鍵字template
函式模板定義格式:
注意:
(1)函式模板不是類或者函式,它只是乙個藍圖。只有在模板例項化後編譯器才會為之生成對應的類或者函式。
(2)模板會被編譯兩次,第一次檢查模板裡的語法是否有錯,如缺少分號;第二次則是在例項化的時候,會檢視所有的呼叫是否都是有效的。
編譯器只能執行兩種轉換
1、const轉換
接收const物件指標或者const物件引用的引數,可以用非const物件的指標或引用進行呼叫
templatet add(const t& x,const t& y)
int main()
2、函式或者陣列到指標的轉換
如果模板不是引用型別的話,那麼它對函式或者陣列型別的實參應轉為指標
template t add(const t* x, const t* y)
int main()
; int b[5] = ;
cout << "a + b = " << add(a, b) << endl;
return 0;
}
模板引數
包括兩種型別,分別是型別形參和非型別形參
模板形參的名字只能在模板形參之後,到模板的宣告和定義的結束使用,遵循就近原則。
template//funtest函式模板
void funtest(t t)
t global;
int main()
注意:1、模板形參的名字在同一模板引數列表內只能使用一次
templatevoid funtest(t a,t b)
2、所有模板前必須加上class或者typename關鍵字進行修飾
templatevoid funtest(t a,u b)
當然,函式模板也是可以過載的。
templatet max(const t& left, const t& right)
templatet max(const t& a, const t& b, const t& c)
;int main()
上面我們過載了兩個求最大值的函式模板,他們只有模板的引數不同而已
int max(const int& left, const int & right)//普通函式
templatet max(const t& left, const t& right)
templatet max(const t& a, const t& b, const t& c)
;int main()
注意:在此種情況下,編譯器會先在非模板的函式中搜尋與之引數型別,個數完全匹配的函式;如果找到了,編譯器便會呼叫它,不會讓函式模板進行例項化;
如果沒有找到,則通過函式模板進行例項化;如果想讓編譯器不呼叫非模板函式,則需要在呼叫的時候進行顯示例項化,這樣的話,函式模板例項化生成的**也和原來定義的
非模板函式不是同一塊**
有時候,不能寫出對所有可能例項化出來的型別都最適合的模板,在某些情況下,通過模板定義的函式有可能對於某個型別是錯誤的,或者編譯失敗,或邏輯錯誤
template int compare(t s1, t s2)
int main()
就可以避免錯誤的發生
注意:特化一定要和原模板函式版本的形參型別完全一致
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...
c 函式模板
關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...
C 函式模板
c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...