C 模板學習

2021-10-02 17:45:15 字數 1829 閱讀 8896

函式過載的幾個不好的地方:

1.**的復用率低,新型別出現時,就需要增加對應的函式。例如交換函式的書寫時,就能體現出復用率低。

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

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

模板又分為函式模板和類模板。

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

typename是用來定義模板引數關鍵字,也可以使用class(不能使用struct代替class)

模板引數例項化分為:隱式例項化和顯式例項化。

隱式例項化就是讓編譯器根據實參推演模板引數的實際型別,顯式例項化就是在函式名後的<>中指定模板引數的實際型別。

注意隱式例項化中模板引數列表只有乙個t,所以不能有多於一種的引數型別需要去推演。例如int,double兩種型別.

templatet add(const t& left,const t& right)

int main()

需要注意的點:

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

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

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

#include#include#include#includeusing namespace std;

templateclass vector

//建構函式初始化

~vector();//使用析構函式在類中宣告,在類外定義

void pushback(const t& data)

void popback()

size_t size()

t& operator(size_t pos) }

int main()

return false;

}

分為全特化和偏特化。

全特化就是將模板引數列表中所有的引數都確定化。

偏特化有以下兩種表現方式:

**部分特化   將模板引數類表中的一部分引數特化

**引數更進一步的限制        偏特化並不僅僅是指特化部分引數,而是針對模板引數更進一步的條件限制所設計出來的乙個特化版本。

1.memcpy,strcpy均是淺拷貝。如果拷貝自定義型別物件,要確定自定義型別物件是淺拷貝還是深拷貝。深拷貝則不能使用memcpy,strcpy

2.使用迴圈複製的方式**的效率比較低。 

3.為了將內建型別與自定義型別區分開,可以採用型別萃取。

經歷步驟:

預處理---->編譯---->彙編----->鏈結

模板復用了**,節省資源,更快的迭代開發

增強了**的靈活性

進行完封裝以後使用起來更加方便,維護性高

導致**膨脹問題,編譯時間也會變長。

出現模板編譯錯誤時,錯誤資訊非常凌亂,不易定位錯誤。

C 之模板 模板的學習 學習模板

c 之模板 模板學習 學習模板 模板就是建立通用的模具,大大提高復用性 函式模板 c 提供兩種模板機制函式模板和類模板 函式模板語法 函式模板作用 建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的型別來代表 語法 template typename t 函式宣告或定義解釋 t...

C 模板學習

模板定義 模板就是實現 重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數,從而實現了真正的 可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。類模板 允許使用者為類定義一種模式,使得類中的某些資料成員 某些成員函式的引數 某些成員函式的返回值,能夠取任意型別 包括系統預定義的...

C 學習 模板

當你在寫 的時候可能會遇到這樣的情況,多處地方都需要呼叫同乙個功能 方法,但是我們不知道呼叫者傳遞進來的引數型別,以及這個方法的返回型別,或許你可能想到的是過載或者重寫,但是還有另一種方式實現就是 模板。當然除此之外,還有類模板,它是實現 重用的一種工具。模板可以說是分為兩種型別,一種是類模板,一種...