泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎.
(模板——函式模板+類模板)
1.函式模板概念:
函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。
2.函式模板格式:
template
<
typename t1,
typename t2,..
....
,typename tn>
返回值型別 函式名(引數列表)
//以swap函式為例
template
<
typename t>
void
swap
( t& left, t& right)
typename是用來定義模板引數關鍵字,也可以使用class;
不能使用struct代替class;
3.函式模板的原理
函式模板本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具。所以模板就是將本來應該我們做的重複的事情交給了編譯器。一段**的執行需要經過 預處理,編譯,彙編,鏈結。這四個階段。在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。然後進入到下一步彙編,最後鏈結,執行。
模板函式與普通函式區別就在於編譯階段的例項化生成。
4.函式模板的例項化
用不同型別的引數使用函式模板時,稱為函式模板的例項化。
模板引數例項化分為:隱式例項化和顯式例項化。
隱式例項化:讓編譯器根據實參推演模板引數的實際型別
顯式例項化:在函式名後的<>中指定模板引數的實際型別
template
<
class
t>
t add
(const t& left,
const t& right)
intmain()
intmain
(void
)
如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯!
5.模板引數的匹配原則
1.乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式
// 專門處理int的加法函式
intadd
(int left,
int right)
// 通用加法函式
template t add
(t left, t right)
void
test()
2.對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板.
// 專門處理int的加法函式
intadd
(int left,
int right)
// 通用加法函式
template
t1 add
(t1 left, t2 right)
void
test()
3.模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換
1.定義格式:
template
class 類模板名
;
2.類模板的例項化
類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
C 函式模板與類模板
一 函式模板 1 函式模板 建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬型別來代表這個通用函式來代表。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中虛擬的型別,從而實現不同函式的功能。作用 功能相同...
C 函式模板與類模板
由菜鳥網整理總結,整理文章 作者做的任務只是將知識點簡化更供人理解以及加了一些自己的認知。模版可以理解成把資料型別做成可以設定的引數化,然後在定義的時候套用,讓資料型別可以隨意變換。使用模板的目的就是能夠讓程式設計師編寫與型別無關的 比如編寫了乙個交換兩個整型int 型別的swap函式,這個函式就只...
C 函式模板與類模板
函式模板是統用的函式描述,其使用泛型定義函式,其中泛型可被具體型別 如 int double 替換。呼叫模板函式,可以使用自動型別推導或顯式指定型別。語法 template ret type func parameter list 注意事項 示例 1 下面的 定義了乙個myswap函式模板,可以交換...