c 模板入門,泛型程式設計 函式模板 類模板

2021-09-25 22:56:31 字數 2318 閱讀 4989

目錄

1. 泛型程式設計

2. 函式模板

2.1 函式模板概念

2.2函式模板格式

2.3 函式模板的原理

2.4 函式模板的例項化

2.5 模板引數的匹配原則

3. 類模板

3.1 類模板的定義格式

3.2 類模板的例項化

如何實現乙個通用的交換函式?

使用函式過載雖然可以實現,但是有一下幾個不好的地方:

1. 過載的函式僅僅只是型別不同,**的復用率比較低,只要有新型別出現時,就需要增加對應的函式

2. **的可維護性比較低,乙個出錯可能所有的過載均出錯

泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎。

函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。

template

返回值型別 函式名(引數列表){}

templatevoid swap( t& left, t& right)
注意:typename用來定義模板引數

關鍵字

也可以使用class(切記:不能使用

struct

代替class)

在編譯器編譯階段,對於模板函式的使用,

編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。比如:

當用double型別使用函式模板時,編譯器通過對實參型別的推演,將t確定為double型別,然後產生乙份專門處理double型別的**,對於字元型別也是如此。

用不同型別的引數使用函式模板時,稱為函式模板的

例項化。模板引數例項化分為:

隱式例項化和顯式例項

1. 隱式例項化:讓編譯器根據實參推演模板引數的實際型別

2.顯式例項化:在函式名後的<>中指定模板引數的實際型別

如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。

1.乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式

2.對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式,那麼將選擇模板。

3.模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換

templateclass 類模板名

;

類模板例項化與函式模板例項化不同,

類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類

// vector類名,vector才是型別

vectors1;

s1.pushback(1);

s1.pushback(2);

s1.pushback(3);

vectors2;

s2.pushback(1.0);

s2.pushback(2.0);

s2.pushback(3.0);

for(size_t i = 0; i < s1.size(); ++i)

cout

cout<

C 泛型程式設計 函式模板 類模板

以前我們寫過乙個簡單的交換函式。我們不難發現交換函式是與型別有很大關係的,int,double.那麼如何實現乙個通用的交換函式呢?void swap int left,int right void swap double left,double right void swap char left,c...

函式模板(泛型程式設計)

函式模板就是將函式型別引數化,方便程式設計。1 普通函式模板 include using namespace std template template是告訴編譯器,要開始泛型程式設計了,並用t替代函式的引數型別 void myswap t a,t b template 定義兩個泛型,其實定義乙個也...

泛型程式設計 函式模板

當函式的業務邏輯相同但是函式的引數不相同時,讓型別引數化,讓程式設計師能夠方便程式設計,就用到了泛型程式設計。基本語法 includeusing namespace std 函式的業務邏輯一樣但是函式的引數不一樣 void myswap01 int a,int b void myswap02 cha...