對於過載函式來說,c++的檢查機制能夠通過引數和所屬類的不同去呼叫不同的過載函式,例如,當我們需要求兩數最大值時,定義man()函式的不同過載版本
int
max(
int x ,
int y)
float
max(
float x ,
float y)
但是如果在main函式中,定義了double x,y,執行max(x,y);時,就會報錯,因為沒有定義double型別的過載函式。所以如何避免因過載函式定義的不全面而帶來的呼叫錯誤?c++引入了模板來解決這個問題。
模板定義:模板就是實現**重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數, 從而實現了真正的**可重用性。
模版分為:函式模版和類模版。
函式模板概念:函式模板代表了乙個家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本
函式模板原理:函式模板本身並不是函式,是編譯器根據使用方式產生特定具體型別函式的模具,編譯器通過模板例項出對應的函式或者類(在編譯階段,編譯器通過對實參型別來生成對應型別的函式)
函式模板格式:template
template
<
typename t>
//typename是用來定義模板引數關鍵字,也可以使用class
t add
(const t& left,
const t& right)
//返回型別 函式名(引數){}
函式模板的例項化:
1.函式模板的隱式例項化
template
<
class
t>
t add
(const t& left,
const t& right)
intmain()
2.函式模板的顯式例項化
int
main
(void
)
模板引數的匹配規則:
1.乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式
2.對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板
3.模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換
類模板定義格式:
template
<
classt1,
classt2,
...>
//template
class 類模板名
;
//在類test中宣告兩個型別為t的成員變數a和b,和乙個返回型別為t的函式test_1
template
<
class
t>
class
test
;//注意:類模板中函式放在類外進行定義時,需要加模板引數列表
template
<
class
t>
test
::test_1()
注意:此時test不是具體的類,而是編譯器根據被例項化的型別生成具體類的模具
類模板的例項化:類模板例項化需要在類模板的名字後面跟<>,將例項化的型別放在<>中,類模板名字不是真正的類,例項化的結果是真正的類
//test是類名,test是型別
test<
int> s1;
模板引數分為型別形參和非型別形參
1.型別形參:在模板引數列表中,跟在class和typename之類的引數名稱
2.非型別形參:用乙個常量作為類(函式)模板的乙個引數,在類(函式)模板中可將該引數當成常量
注意:浮點數,類物件,字串不允許作為非型別模板引數
非型別的模板引數必須在編譯器就能確認結果
什麼是模板特化:在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式,分為函式模板特化和類模板特化
函式模板特化
特化部驟:
1.必須先存在乙個基礎的函式模板
2.關鍵字template後面接一對空尖括號 <>
3.函式名後面跟一對尖括號,尖括號中指定需要特化的型別
4.函式形參表:必須要和模板函式的基礎引數型別完全相同,不同則報錯
template
<
class
t>
bool
max(t& left, t& right)
//函式模板特化
template
<
>
bool max<
int*
>
(int
*& left,
int*
& right)
類模板特化
1.全特化:將模板引數列表中所有的引數確定化
template
<
classt1,
class
t2>
class
aprivate
: t1 a;
t2 b;
}//類模板全特化
template
<
>
class
a<
int,
char
>
private
: t1 a;
t2 b;
}
2.偏特化:針對模板引數進一步進行條件限制
部分特化
//將第二個引數特化為int
template
<
class
t1>
class
aint>
private
: t1 a;
t2 b;
}
進一步限制
//將兩個引數特化為指標型別
template
<
typename t1,
typename t2>
class
a, t2*
>
private
: t1 a;
t2 b;
}
模板優缺點
優點:1.模板復用了**,節省資源,更快迭代開發
2.增強了**的復用性
缺點:1.模板會導致**膨脹問題,導致編譯時間變長
2.模板編譯錯誤資訊混亂,不易定位錯誤
C 模板總結
1 模板概念 模板是泛型程式設計的基礎。所謂泛型程式設計就是編寫與型別無關的邏輯 是一種復用的方式。模板分為模板函式和模板類。2 typename 與 class template 採用 class 來宣告模板 class template 採用 typename 來宣告模板 class 這兩種一般...
C 模板總結
前提 我們要實現乙個通用的交換函式swap,就是讓它適用於任何乙個型別。比如 int,char,double.但是我們要寫很多交換的函式,對swap函式進行過載。那我們如何解決這個問題?可不可以給編譯器乙個模子,讓編譯器來給我們實現不同型別的轉化?1.概念 函式模板代表了乙個函式家族,在使用時被引數...
C 類模板的總結
模板類是乙個很有用的工具,平常使用比較多的像std vector,std map,std queue都是模板類,可以說很方便.但是背後的實現可以說是很複雜,包括記憶體分配,包括快速訪問.我們之所以能這麼方便的使用,全是站在了巨人的肩膀上.模板定義的c 實體如下 本文主要介紹類模板和函式模板,首先我們...