c++提供兩種模板機制:函式模板,類模板。
函式模板:
建立乙個通用函式,其返回值型別和形參型別不具體確定,用乙個虛擬的型別來代替。
如:void test(int a);其中的void和int可以先不確定,等執行的時候在確定。
語法:
template
<
typename t>
template - 宣告建立模板
typename - 表明其後面的符號是一種資料型別,可以用class代替
t - 通用的資料型別,名稱可以替換,通常為大寫字母
#include
#include
#include
using
namespace std;
template
<
typename t>
void
swap
(t &a, t &b)
intmain()
注意事項:
自動型別推導 ,必須推導出一致的資料型別t,才可以使用
模板必須要確定出t的資料型別,才可以使用
template
<
typename t>
void
test()
這樣呼叫上面這個函式的話就不能用自動型別推導了,要給定型別
如:test< int >();
普通函式與 函式模板的呼叫規則:
1.如果函式模板 和普通函式都可以實現,優先呼叫普通函式
2.可以通過空模板引數列表來強制呼叫函式模板,例:swap<>(引數,…,)
3.函式模板也可以發生過載(引數個數的不同)
4.如果函式模板可以產生更好的匹配,優先呼叫函式模板(如果呼叫普通函式需要強制型別轉換,則優先呼叫模板)
建立乙個通用類,類中的成員資料型別可以不具體制定,用乙個虛擬的型別來代表。
template
<
typename typename,
typename typeage>
class
person
typename m_name;
typeage m_age;};
void
test()
類模板與函式模板的區別:
1.類模板沒有自動型別推導的使用方式。
2.類模板在模板引數列表中可以有預設引數。
template
<
typename typename,
typename typeage=
int>
類模板與繼承:
當類模板碰到繼承時,需要注意以下幾點:
1.當子類繼承的父類是乙個類模板時,子類在宣告的時候,需指定出父類中的t的型別。
2.如果不指定,編譯器無法給子類分配記憶體
class
person
;class
son:
public person<
int>
;
3.如果想靈活指出父類中t的型別,子類也需變為類模板
template
<
typename t>
class
person
;template
<
typename t1,
typename t2>
class
son:
public person
;void
test()
類模板成員函式類外實現時,要加上模板引數列表
template
<
typename t1,
typename t2>
class
person
;template
<
typename t1,
typename t2>
person
::person
(t1 name, t2 age)
template
<
typename t1,
typename t2>
void person
::show()
void
test()
函式模板與類模板(模板類)
什麼是泛型程式設計?泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。模板分為函式模板和類模板 下面我們就來說說函式模板 函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的型別版本 格式 template 返回值型別 函式名 引數列表 templatet1 ...
模板 函式模板與類模板
模板 template 是乙個將資料型別引數化的工具。模板分為函式模板和類模板兩種。在定義模板的時候不說明某些函式引數或者資料成員的型別,而將它們的資料型別作為模板引數。在使用模板時根據實參的資料型別確定模板引數即資料型別,從而得到模板的乙個例項。函式模板 function template 函式模...
函式模板與類模板
c 提供的函式模板可以定義乙個對任何型別變數進行操作的函式,從而大大增強了函式設計的通用性。使用函式模板的方法是先說明函式模板,然後例項化成相應的模板函式進行呼叫執行。函式模板的一般說明形式如下 template 模板形參表 返回值型別 函式名 模板函式形參表 其中,模板形參表 可以包含基本資料型別...