C 函式模板與類模板

2021-09-25 01:34:17 字數 2310 閱讀 7364

由菜鳥網整理總結,整理文章:

作者做的任務只是將知識點簡化更供人理解以及加了一些自己的認知。

模版可以理解成把資料型別做成可以設定的引數化,然後在定義的時候套用,讓資料型別可以隨意變換。

使用模板的目的就是能夠讓程式設計師編寫與型別無關的**。比如編寫了乙個交換兩個整型int 型別的swap函式,這個函式就只能實現int 型,對double,字元這些型別無法實現,要實現這些型別的交換就要重新編寫另乙個swap函式。使用模板的目的就是要讓這程式的實現與型別無關,比如乙個swap模板函式,即可以實現int 型,又可以實現double型的交換。模板可以應用於函式和類。

格式:

template 返回型別 函式名(引數列表)

在這段**中,class 可以替換成 typename ,如下

template 返回型別 函式名(引數列表)

;

在函式模版中,class與typename沒有區別。

<>裡面的形參叫模版形參,模版形參不能為空。

函式模版定義例項:

template void swap(t& a, t& b);
函式模版不能像類模版一樣指定形參型別

編譯器會通過你所定義的變數型別,將引數的資料型別自動識別。

例如: (該例子摘自:

#include using namespace std;

templatevoid swap(t & x, t & y)

;int main()

格式:

templateclass 類名

;

在這段**中,class 可以替換成 typename 。

類模版例項化:

類名《形參的型別列表》 物件名;
例如 :

template
int a在模版內部定義是常量型別,所以在傳入的時候要注意,如果你傳入的是變數,則會報錯。傳入的一定是常量或者是常量表示式。

非型別模板的形參只能是整型,指標和引用,像double,string, string **這樣的型別是不允許的。但是double &,double *,物件的引用或指標是正確的。

非型別模板形參的形參和實參間所允許的轉換

1、允許從陣列到指標,從函式到指標的轉換。如:template class a{}; int b[1]; am;即陣列到指標的轉換

2、const修飾符的轉換。如:templateclass a{}; int b; a<&b> m; 即從int *到const int *的轉換。

3、提公升轉換。如:templateclass a{}; const short b=2; am; 即從short到int 的提公升轉換

4、整值轉換。如:templateclass a{}; a<3> m; 即從int 到unsigned int的轉換。

5、常規轉換。

可以為類模板的型別形參提供預設值,但不能為函式模板的型別形參提供預設值。函式模板和類模板都可以為模板的非型別形參提供預設值。

例如:為第二個模板型別形參t2提供int型的預設值。

類模板的型別形參預設值形式為:

templateclass a{};
類模板型別形參預設值和函式的預設引數一樣,如果有多個型別形參則從第乙個形參設定了預設值之後的所有模板形參都要設定預設值,比如templateclass a{};就是錯誤的,因為t1給出了預設值,而t2沒有設定。

class與typename在引數型別中沒有不同。但typename可以在用來標識巢狀依賴型別。

什麼是巢狀依賴型別?

就是依賴於模版的形參的型別。

舉個例子,如果你在來了模版中要傳入的形參是乙個類,你在類中使用typedef定義了乙個自定義型別,然後要在模版中使用,如果你這樣寫。

class a;

templateclass f

會報錯。因為編譯器在class f中會把t看成是靜態變數(例如 int char short這些)。所以編譯器一定會報錯。

為了避免這種情況,可以使用typename來修飾t。

typename的作用就是告訴編譯器這是乙個型別,不是變數或者是其他東西。

稍加改進之後的**:

class a;

templateclass f

C 函式模板與類模板

一 函式模板 1 函式模板 建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬型別來代表這個通用函式來代表。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中虛擬的型別,從而實現不同函式的功能。作用 功能相同...

C 函式模板與類模板

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎.模板 函式模板 類模板 1.函式模板概念 函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。2.函式模板格式 template typename t1,typena...

C 函式模板與類模板

函式模板是統用的函式描述,其使用泛型定義函式,其中泛型可被具體型別 如 int double 替換。呼叫模板函式,可以使用自動型別推導或顯式指定型別。語法 template ret type func parameter list 注意事項 示例 1 下面的 定義了乙個myswap函式模板,可以交換...