C 函式模板詳解及注意事項

2021-10-09 02:42:32 字數 2767 閱讀 4727

c++語言引入模板技術,它使用引數化的型別建立相應的函式和類,分別稱之為函式模板和類模板,本章介紹函式模板

函式模板:

可以用來建立乙個通用功能的函式,以支援多種不同形參,進一步簡化過載函式的函式體設計

意義:對於功能完全一樣,只是引數型別不同的函式,能寫一段通用**是用於多種不同的資料型別,會使**的可重用性大大提高,從而提高軟體的開發效率!

函式模板(function template):

定義:函式模板不是乙個實在的函式,編譯器不能為其生成可執行**。定義函式模板後只是乙個對函式功能框架的描述,當它具體執行時,將根據傳遞的實際引數決定其功能。

格式:template

1、函式模板是通用的函式描述

函式模板的宣告在關鍵字template後跟隨乙個或者多個模板在尖括號內的引數和原型。與普通函式相對,它通常是在乙個轉換單元裡面宣告,而在另乙個單元中定義,你可以在某個標頭檔案中定義模板

在這裡,class和typename是相同的。也就是說,在宣告乙個template type parameter(模板型別引數)的時候,class和typename意味著

完全相同的東西。

template與template一般情況下這兩個通用,但有乙個特例,就是當 t 是乙個類,而這個類又有子類(假設名為 innerclass) 時,應該用 template

函式模板定義一般形式如下:

template《型別形式引數》

函式返回型別 函式名(形式參數列)

定義t作為模板函式,或者是佔位符,當例項化函式時,它將替換具體的資料型別。max是函式名,t1和t2是函式的引數,返回值型別是t。

#include

using

namespace std;

template

<

class

t>

//函式模板定義

t max

(t x, t y)

intmain

(void)/*

該函式可以匹配max(n, m); 這條語句。於是編譯器就自動用 int 替換 max 模板中的 t,生成上面的 max 函式,

將該 max 函式的源**加入程式中一起編譯,並且將max(n, m); 編譯成對自動生成的 max 函式的呼叫。

同理,編譯器在編譯到max(f, g); 時會用 double 替換 max 模板中的 t,自動生成以下 max 函式

double max(double x, double y)

*/

執行結果圖:

注:#define巨集定義是編譯指令可以在預編譯器對**進行替換

上述**也可以使用巨集定義來實現,但巨集定義#define只是進行簡單替換,它無法對型別進行檢查,有時結果可能不是預計的。

請看下面例子:

#include

#define max(a,b) ((a>b)?(a):(b))

using

namespace std;

intmain

(void

)

執行結果圖:

模板函式和#define巨集定義相似,但模板函式是用模板例項化得到的函式,它與普通函式沒有本質區別,可以過載模板函式。

整型數和實型數編譯器可以直接進行比較,所以使用函式模板後也可以直接進行比較,但如果是字元指標指向的字串該如何比較呢?

答案是通過過載函式模板來實現。通常字串需要庫函式來進行比較,通過過載函式模板實現字串的比較。

#include

#include

using

namespace std;

template

<

class

t>

//模板函式

t max

(t t1, t t2)

char

*max

(char

* t1,

char

* t2)

//過載函式

intmain

(void

)

執行結果圖:

1、模板的定義和宣告最好不要放在不同地方

模板在定義時即使用,要像其他普通函式或類在.h中宣告,.cpp中定義的話,很可能出現問題(一般是不可行的,但好像有些解決辦法):

模板類編譯過程**現「undefined reference to」的問題,參見:

2、模版不支援在區域性函式中宣告定義或使用。

3、模板非型別形參

模板除了定義型別引數,還可以在模板定義非型別引數。

C 模板類詳解及注意事項

c 中有乙個重要特性,那就是模板型別。類似於objective c中的泛型,c 通過類模板來實現泛型支援。它使用引數化的型別建立相應的函式和類,分別稱之為函式模板和類模板。模板是一種對型別進行引數化的工具,通常有兩種形式 函式模板和類模板。函式模板針對僅引數型別不同的函式 類模板針對僅資料成員和成員...

C 模板 30 函式模板注意事項和陣列排序練習

前面學習了函式模板,有了乙個基本的了解。我們先來學習函式模板,後面還有乙個類模板。先看看函式模板使用需要注意哪些事項,然後通過乙個陣列排序來練習函式模板。1.函式模板注意事項 1 自動型別推導,必須推導出一致的資料型別t,才可以使用 2 模板必須要確定t的資料型別,才可以使用 例子template ...

C 模板使用注意事項

c 模板使用有很多的規則,如果稍有問題便會出問題。由於c 宣告模板和實現模板規則不一樣,很容易出錯,現將遇到的注意事項列出來,當便大家也方便自己以後找錯。1 類的內部區域性模板成員函式不能是虛擬的,virtual這個識別符號。2 宣告了模板類,在實現其介面的時候注意在類網域名稱加上 類名 定義的泛型...