函式模板是建立乙個通用函式,它所用到的資料的型別(包括返回值型別、形參型別、區域性變數型別)可以不具體指定,而是用乙個虛擬的型別來代替(實際上是用乙個識別符號來佔位),等發生函式呼叫時再根據傳入的實參來推導真正的型別。這個通用函式就稱為函式模板。
確定乙個函式模板,可以為程式設計節約時間,當傳入引數時,自動推導,不用再根據情況隨時改變引數或者返回值的型別,而是由系統推導。
template
這個是乙個模板頭,固定寫法,***跟乙個類(類模板)或者函式(函式模板)template
是定義函式模板的關鍵字,後面緊跟尖括號<>
,尖括號包圍的是型別引數。typename
也是乙個關鍵字,用來宣告具體的型別引數t,這裡的t也可以用其他的符號表示,型別引數的命名規則跟其他識別符號的命名規則一樣,不過一般習慣於用t、t1等引數名。
template
<
typename t>
t fun
(t a, t b)
intmain()
輸出為:
30109
由結果可以看出,模板自動推導出所需要的引數型別。
函式模板與普通函式的區別,以及呼叫原則
1、函式模板和普通函式可以過載。
2、如果出現過載,優先呼叫普通函式,如果普通函式沒有實現,報錯
3、想要強制呼叫模板,那麼可以使用顯示指定型別呼叫
4、如果函式模板可以產生更好的匹配,那麼優先呼叫函式模板
template
<
typename t>
t fun
(t a, t b)
intfun
(int a,
int b)
intmain()
輸出為:
普通30
普通109
模板109
由此可見,當模板函式和普通函式過載,會優先呼叫普通函式。
若要呼叫模板函式,可以指定函式型別來呼叫,如:fun(c, d)
,此時呼叫的是模板函式。
函式模板也可以提前宣告,不過宣告時需要帶上模板頭,並且模板頭和函式定義(宣告)是乙個不可分割的整體,它們可以換行,但中間不能有分號。
#include
#include
using
namespace std;
//類模板.引數
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
::showperson()
intmain()
輸出為:
xaiowang
18由結果可見,操作正確。同時也可以看出,在構建類模板的時候,所要遵循的規範。『
定義類模板時的格式:
template
<
typename 型別引數1
,typename 型別引數2
, …>
class 類名
;
在函式類內宣告,類外實現的時候:
template
<
typename 型別引數1
,typename 型別引數2
, …>
返回值型別 類名《型別引數1
, 型別引數2,.
..>
::函式名(形參列表)
通過類模板來建立物件的時候,需要指明具體的資料型別。比如personp("xiaowang", 18);
,
就在建立物件之前,定義了所要傳入模板的引數型別。
C 模板複習參考筆記
型別引數化 template 返回型別 函式名 引數列表 這裡的返回型別,引數列表的形參型別 可以寫成你在尖括號 裡規定的形參類名,如t,如下 template t min t a,m b 如果你要定義模板成員方法,1.因為它是乙個成員方法 寫外邊,加類名和作用域符 2.因為它是乙個模板方法 配合t...
C 複習整理 i 和 i
理論上 i更快,實際與編譯器優化有關,通常幾乎無差別。i 實現 為 int operator int 返回乙個int型的物件本身 i實現 為 int operator 返回乙個int型的物件引用簡單從返回的值來說,i 返回的是i的值,而 i返回的是i 1的值。從返回的東西來說,i返回的是i的引用,i...
模板相關知識 C 整理
模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。模板是一種對型別進行引數化的工具 通常有兩種形式 函式模板和類模板 函式模板針對僅引數型別不同的函式 類模板針對僅資料成員和成員函式型別不同的類。使用模板的...