特化和過載的區別
模板(template)指c++程式設計設計語言中採用型別作為引數的程式設計,支援通用程式設計。c++ 的標準庫提供許多有用的函式大多結合了模板的觀念,如stl以及io stream。模板是c++支援引數化多型
的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。
模板是一種對型別進行引數化的工具,通常有兩種形式:函式模板
和類模板
;
使用模板的目的就是能夠讓程式設計師編寫與型別無關的**。
c++只有模板顯式例項化(explicit instantiation),隱式例項化(implicit instantiation),特化(specialization,也譯作具體化,偏特化)。
template
<
typename 形參名,typename 形參名,…>
class 類名
;
template
<
class
t>
class
arrary
;//template class declaration.
函式返回型別 類名模板形參
::函式名(引數列表)
注意:
template
<
class 形參名,class 形參名,...
...>
返回型別 函式名(引數列表)
其中template和class是關鍵字,class
可以用typename
關鍵字代替,在這裡typename 和class沒區別,<>括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。
template
<
class
t>
void
swap
(t &a, t &b )
;
注意:
// 主模板函式
template
<
typename t,
class
n>
void
func
(t num1, n num2)
// 過載模板函式
template
<
class
n>
void
func
(int num1, n num2)
// 過載模板函式
template
<
class
n>
void
func
(n num1)
模板只有在執行時才會生成相應的例項,會影響執行效率。
編譯器進行型別推導,在編譯期間生成相應的例項
swap<
int>
(a,b)
;
其中
是可省的
array<
int> arr;
其中
是不可省的
顯式例項化,需要在模板定義後顯式宣告,在編譯期間生成相應的例項。 雖然會增加編譯時間,但提高了執行效率。
注意顯式例項化的寫法:
template
void swap<
int>
(int
&a,int
&b);
template
class
array
<
int>
;//explicit instantiation. 顯式例項化
對於函式模板,只有全特化,不能偏特化。偏特化功能可以通過模板函式的過載實現。
對於類模板,可以全特化、偏特化,但不能過載。(沒有過載類的說法)
c++模板全特化之後已經失去了template的特性。
乙個模板被全特化/偏特化的條件:
必須有乙個主模板類
模板型別被全部/部分明確化
// 主模板
template
<
typename t,
class
n>
void
func
(t num1, n num2)
// 全特化模板
template
<
>
void
func
(int num1,
double num2)
注意全特化類的定義寫法
// 主模板
template
<
typename t,
class
n>
class
test_class};
// 全特化模板
template
<
>
class
test_class
<
int,
double
>
};
注意偏特化類的定義寫法
// 主模板
template
<
typename t,
class
n>
class
test_class};
// 偏特化模板
template
<
class
n>
class
test_class
<
int, n>
};
不能將特化和過載混為一談。全特化和偏特化都沒有引入乙個全新的模板或者模板例項。它們只是對原來的泛型(或者非特化)模板中已經隱式宣告的例項提供另一種定義。 C 模板基礎
在一般情況下,我們進行程式設計的時候就會確定參與運算所有物件的型別,以方便編譯器執行時候及時的分配記憶體,通俗的講也就是讓編譯器明白你要幹什麼,但是很多的時候會有很多尷尬的瞬間,比如舉乙個簡單的例子,現在如果我要對乙個整形的陣列進行排序,我們都知道函式的作用是包裝乙個 塊,方便我們重複呼叫,從而降低...
C 基礎 模板基礎與函式模板
求兩個int float char型別的資料的最大值 c裡面要這樣寫 int maxint int x,int y double maxdouble double x,double y char maxchar char x,char y c 使用函式過載 多個同名函式處理多種型別資料的語法現象 可...
C 基礎 C 模板總結
模板是泛型程式設計的基礎,分為模板函式和模板類 泛型程式設計就是與型別無關的邏輯 是一種復用的方式。那麼為什麼要有泛型程式設計呢?c 是一門強型別的語言,無法像動態語言那樣,可以寫一段邏輯 把任意型別傳進去。為了解決這個問題所以有了泛型程式設計,通過把通用的邏輯設計為模板,可以擺脫型別的限制,提供了...