今天,我們來學習總結一下有關c++中模板的概念和知識。
一.模板的概念
1.我們知道,函式的呼叫要根據給出的實參型別以及函式名來確定,拿通用的加法函式來說,不同的實參所呼叫的函式不同。因此我們需要通過函式過載來實現對不同型別資料的加法操作。
int add(const int & left, const int & right)
double add(const double &left, const double&right)
這個過程只要有新型別的出現,我們就需要新增新函式。**效率不高,而且復用率差。而且函式過載如果僅僅是返回值不同是無法解決的。
如果使用公共基類來編寫通用的**,將失去型別檢查的優點。以後要實現的類,都必須公共的繼承自某乙個基類,使得**的維護更加困難。
如果採用巨集處理來實現,首先 ,巨集並不是乙個函式,它不會進行型別檢測,因此安全係數差。
2.下面我們就來介紹泛型程式設計:泛型程式設計就是編寫與型別無關的邏輯**,這是實現**復用的一種高效的手段。而模板就是泛型程式設計的基礎。
模板分為兩大類:(1)函式模板;(2).類模板
(1)函式模板:它代表了乙個函式家族,函式與型別無關,在使用時被引數化,根據實參型別產生特定的函式版本。
模板函式的定義:關鍵字(template)
templatet add(t left, t right)
typename是用來定義模板引數的關鍵字,也可以使用class,注意struct不能代替兩者。
模板函式也可以宣告為內聯函式,但是關鍵字inline必須放在模板引數列表之後,返回值之前,不能放在template之前
1.1模板例項化
模板不是類或者函式,在被編譯器產生指定型別的類或者函式的過程我們稱之為模板例項化。
templatet add(t left, t right)
int main()
在編譯器編 譯呼叫函式過程中,編譯器會根據實參來確定模板的模板引數型別,從而呼叫模板函式。比如上面的**,當我們第一次呼叫兩個整形作為實參時,相應的模板函式也會就會把模板函式例項化兩個整形的加法函式。
下面是程式的編譯呼叫過程:
1.例項化之前,編譯器先檢查模板**本身,檢視是否有語法錯誤。
2.例項化期間,檢查模板**,檢視是否所有的呼叫都有效。注意:例項化型別不支援某些函式的呼叫
3.實參推演,從函式實參確定模板形參型別,多個型別形參的實參必須完全匹配
4.型別形參轉換:const轉換:接收const引用或者const指標的函式可以分別用非const物件的引用或者指標來呼叫;
陣列或者函式到指標的轉換:如果模板形參不是引用型別,則對陣列或者函式型別的實參應用常規指標轉換,陣列實參將當作指向其第乙個元素的指標,函式實參當作指向函式型別的指標。
模板引數
模板引數有兩種,第一種是模板引數和呼叫引數。
模板形參又分為型別引數和非型別引數。
型別引數即型別不確定,而非型別引數即引數為確定的內建型別。
注意:模板的形參名字只能在模板形參之後到模板的宣告或者定義的末尾之間使用,而且遵循名字的遮蔽規則。
模板的形參名字在同一模板形參列表中只能使用一次;
所有模板形參前面必須加上class或者typename;
在函式模板的內部不能指定預設的模板實參。
#includeusing namespace std;
typedef int t;
templatevoid funtest(t t)
t gloab;
int main()
函式模板的特化
template返回值 函式名(引數列表)
注意:特化的宣告必須與特定的模板相匹配,而且const t p在編譯時實際上是t const p
二.模板類
類模板也是模板,必須以template關鍵字開頭,後接模板形參表。
templat
注意:在類外定義的類的成員函式前面也要加上模板引數列表,並且要加上類的作用域。
浮點數和類物件是不允許作為非型別模板引數的。
模板的例項化:全特化與偏特化
1.全特化
templateclass seqlist
;templateseqlist::seqlist()
:_size(0)
, _cacpacity(0)
, _data(new t[_cacpacity])
2.偏特化
templateclass data(t1, int)
模板的分離編譯
解決方法:
1.在模板標頭檔案***.h裡面顯示例項化->模板類的定義後面新增template class seqlist;
2.將宣告和定義放到乙個檔案***.hpp裡面。
C 學習記錄之模板篇
c 問題記錄之模板 關於友元的注意事項 1.友元關係不可傳遞。2.友元關係的單向性。3.友元宣告的形式和數量不受限制。友元只是封裝的補充。友元的使用破壞了封裝性。友元函式沒有this指標,為什麼?因為this指標是在指向類成員本身,但是友元函式並不在類裡面,而是在類外面 友元函式是不能被繼承的,就像...
C 模板詳解 使用篇
假如我們需要取得兩個變數中較大的變數,或許,我們可以通過過載的方式實現,如下。int max int fir,int sec float max float fir,float sec double max double fir,double sec 有一天,我們定義了乙個新的type,school...
C 模板之模板特化
1.模板特化概念 使用模板可以實現一些與型別無關的 但對於一些特殊型別的可能會得到一些錯誤的結 果。就需要對模板進行特化。即 在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。2.模板特化分類 必須要先有乙個基礎的函式模板 關鍵字template後面接一對空的尖括號 函式名後跟一對尖括號,尖括...