類模板首先思考乙個問題:如何實現乙個通用的交換函式呢?
這裡很多人可能會想到函式過載,沒錯,函式過載可以實現不同型別資料的交換,但是也有很大的缺陷:那能否給編譯器乙個模子,讓編譯器根據不同的型別利用該模子來生成**呢?過載的函式僅僅只是型別不同,**的復用率比較低,只要有新型別出現時,就需要增加對應的函式
**的可維護性比較低,乙個出錯可能所有的過載均出錯
這裡就要印入泛型程式設計的概念概念:泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎。
函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。函式模板的格式
template返回值型別 函式名 (引數列表) {}
template
void
swap
( t& left, t& right)
//注意:typename是用來定義模板引數的關鍵字
//也可以使用class(切記:不能使用struct)
在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。函式模板的例項化比如:當用double型別使用函式模板時,編譯器通過對實參型別的推演,將t確定為double型別,然後產生乙份專門處理double型別的**,對於字元型別也是如此。
隱式例項化:讓編譯器根據實參推演模板引數的實際型別
template t add
(const t& left,
const t& right)
intmain()
顯式例項化:在函式名後的<>中指定模板引數的實際型別
int
main
(void
)
如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。函式模板的引數匹配原則
乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式類模板的定義格式對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板
模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換
template., class tn>
class 類模板名
;
示例:
// 動態順序表
// 注意:vector不是具體的類,是編譯器根據被例項化的型別生成具體類的模具
template
class vector
// 使用析構函式演示:在類中宣告,在類外定義。
~vector()
;void
pushback
(const t& data);
void
popback();
// ...
size_t size()
t& operator[
](size_t pos)
private:
t* _pdata;
size_t _size;
size_t _capacity;};
// 注意:類模板中函式放在類外進行定義時,需要加模板引數列表
template
vector::
~vector()
類模板的例項化類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
// vector類名,vector才是型別
vector<
int> s1;
vector<
double
> s2;
C 基礎知識(八)泛型
泛型的好處很多,包括復用性 可供多個型別使用而不用每個型別都定義一次 型別安全 不合法的型別報錯 高效率 減少裝箱和拆箱 舉例 假設我們有乙個父類animal,所有動物繼承這個類,現在需要做乙個比較動物重量的方法,如果不用泛型,則我們隊沒類動物都需要過載一次比較的方法 public class an...
c 模板與泛型程式設計基礎
1 定義函式模板 function template 函式模板是乙個獨立於型別的函式,可以產生函式的特定型別版本。implement strcmp like generic compare function template int compare const t v1,const t v2 模板定...
C 泛型程式設計 模板
在學習c c 過程中,我們可能常用幾種函式,由於傳入的引數不同,需要進行不同的函式的編寫,在c語言中需要根據引數和功能的不同重新編寫新的函式,而在c 中有函式過載這樣的機制,一定程度上解決了問題,但是 過載的函式僅僅只是型別不同,的復用率比較低,只要有新型別出現時,就需要增加對應的函式 的可維護性比...