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 宣告了模板類,在實現其介面的時候注意在類網域名稱加上 類名 定義的泛型...