模板觀念和函式模板

2021-10-10 16:43:58 字數 2170 閱讀 7733

模板

模板是c++的一種特性,允許函式(物件),通過泛型的形式表現或執行

模板可以使函式或類在對應不同的型別的時候正常工作,無需為每乙個型別都寫乙份**

兩種模板

類模板:使用泛型引數的類

函式模板:使用泛型引數的函式

模板例項化

模板的宣告其實並未給出乙個函式或類的完全定義,只是提供了乙個函式或類的語法框架

例項化是從模板構建出乙個真正的函式或類的過程

有兩種型別:

顯示例項化:在**中明確指定要針對哪種型別進行s例項化

隱式例項化:在首次使用時根據具體情況使用一種合適的型別進行例項化

add <

int>(1

+2);

//隱式

add<

char

>

('a'

,'b'

)//顯式

函式模板

函式模板是引數化的一族函式

通過函式模板,可以定義一系列函式,這些函式都基於同一套**,但是可以作用在不同型別的引數上

例子

template

<

typename t>

//模板的定義

t add

( t a, t b)

//模板的定義必須要和函式模板在一起

//定義了add函式模板,其中傳參為t,返回值為t

intmain()

對於不同的型別,都從模板例項出不同的形體

我們對他進行兩次呼叫,分別進行不同的傳參,他就有不同的表現形式,比如傳入是int,就是int,傳入char就是char

例項化:用具體的型別代替模板引數t的過程就叫例項化,從而產生乙個模板例項結論

模板被編譯了兩次

沒有例項化之前,檢查模板**本身是否有語法錯誤

例項化期間,檢查模板的呼叫是否合法

引數推導

模板引數是有傳遞給模板函式的實參決定的

不允許自動型別轉換,每個t必須嚴格匹配

add (1,

2);//yes

add (1,

2.3)

;//error

add (

'a',2)

;//error

函式模板過載

函式模板也可以像普通函式一樣過載

非模板函式可以和同名模板函式共存

編譯器通過函式模板引數推導來決定使用呼叫哪個過載

template

<

typename t,

typename t_1>

t_1 add

( t a, t b)

template

<

typename t>

void

add(t a, t b)

void

add(

int a,

int b)

intmain()

{int a =

2, b =2;

add(1,

2);//優先呼叫函式

add<

int>(1

,2);

//呼叫函式模板需要顯示呼叫

add<

int,

int>(1

,2)//有返回值的函式模板需要顯式呼叫

總結

對於不同的實參型別,函式模板定義了一組函式

當傳遞模板實參的時候,函式模板依據實參的型別進行例項化

可以顯式指定模板實參型別

函式模板可以過載

當過載函式模板的時候,將改變限制在:顯示指定模板引數

函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...