国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

簡單掌握C++中的函數模板

2020-01-26 14:39:46
字體:
來源:轉載
供稿:網友

1.函數模板的聲明和模板函數的生成
1.1函數模板的聲明
函數模板可以用來創建一個通用的函數,以支持多種不同的形參,避免重載函數的函數體重復設計。它的最大特點是把函數使用的數據類型作為參數。
函數模板的聲明形式為:
template<typename 數據類型參數標識符>

<返回類型><函數名>(參數表){  函數體}

其中,template是定義模板函數的關鍵字;template后面的尖括號不能省略;typename(或class)是聲明數據類型參數標識符的關鍵字,用以說明它后面的標識符是數據類型標識符。這樣,在以后定義的這個函數中,凡希望根據實參數據類型來確定數據類型的變量,都可以用數據類型參數標識符來說明,從而使這個變量可以適應不同的數據類型。例如:

template<typename T>T fuc(T x, int y){  T x;  //……}

如果主調函數中有以下語句:

double d;int a;fuc(d,a);

則系統將用實參d的數據類型double去代替函數模板中的T生成函數:

double fuc(double x,int y){  double x;  //……}

函數模板只是聲明了一個函數的描述即模板,不是一個可以直接執行的函數,只有根據實際情況用實參的數據類型代替類型參數標識符之后,才能產生真正的函數。
關鍵字typename也可以使用關鍵字class,這時數據類型參數標識符就可以使用所有的C++數據類型。
1.2.模板函數的生成
函數模板的數據類型參數標識符實際上是一個類型形參,在使用函數模板時,要將這個形參實例化為確定的數據類型。將類型形參實例化的參數稱為模板實參,用模板實參實例化的函數稱為模板函數。模板函數的生成就是將函數模板的類型形參實例化的過程。例如:
使用中應注意的幾個問題:
(1)函數模板允許使用多個類型參數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:
template<class 數據類型參數標識符1,…,class 數據類型參數標識符n>

<返回類型><函數名>(參數表){   函數體}
(2)在template語句與函數模板定義語句<返回類型>之間不允許有別的語句。如下面的聲明是錯誤的:
template<class T>int I;T min(T x,T y){  函數體}

(3)模板函數類似于重載函數,但兩者有很大區別:函數重載時,每個函數體內可以執行不同的動作,但同一個函數模板實例化后的模板函數都必須執行相同的動作。

2 函數模板的異常處理
函數模板中的模板形參可實例化為各種類型,但當實例化模板形參的各模板實參之間不完全一致時,就可能發生錯誤,如:

template<typename T>    void min(T &x, T &y){ return (x<y)?x:y; }void func(int i, char j){  min(i, i);  min(j, j);  min(i, j);  min(j, i);}

例子中的后兩個調用是錯誤的,出現錯誤的原因是,在調用時,編譯器按最先遇到的實參的類型隱含地生成一個模板函數,并用它對所有模板函數進行一致性檢查,例如對語句

min(i, j);

先遇到的實參i是整型的,編譯器就將模板形參解釋為整型,此后出現的模板實參j不能解釋為整型而產生錯誤,此時沒有隱含的類型轉換功能。解決此種異常的方法有兩種:
(1)采用強制類型轉換,如將語句min(i, j);改寫為min(i,int( j));
(2)用非模板函數重載函數模板
方法有兩種:
(1)借用函數模板的函數體
此時只聲明非模板函數的原型,它的函數體借用函數模板的函數體。如改寫上面的例子如下:
template<typename T>      

void min(T &x, T &y){ return (x<y)?x:y; }int min(int,int);void func(int i, char j){  min(i, i);  min(j, j);  min(i, j);  min(j, i);}

執行該程序就不會出錯了,因為重載函數支持數據間的隱式類型轉換。
(2)重新定義函數體
就像一般的重載函數一樣,重新定義一個完整的非模板函數,它所帶的參數可以隨意。C++中,函數模板與同名的非模板函數重載時,應遵循下列調用原則:
• 尋找一個參數完全匹配的函數,若找到就調用它。若參數完全匹配的函數多于一個,則這個調用是一個錯誤的調用。
• 尋找一個函數模板,若找到就將其實例化生成一個匹配的模板函數并調用它。
• 若上面兩條都失敗,則使用函數重載的方法,通過類型轉換產生參數匹配,若找到就調用它。
•若上面三條都失敗,還沒有找都匹配的函數,則這個調用是一個錯誤的調用。

3.小例子

#include <iostream> #include <string> using namespace std;  template<class T> void swap(T *x, T *y){//函數的模板,只要能使用等號賦值類型都可以用這個模板互換   T temp = *x;   *x = *y;   *y = temp; }  void main(){   int i = 9, j = 5;   float k = 9.2, l = 5.6;   swap(&i, &j);//交換整形   swap(&k, &l);//交換浮點型   cout<<"i = "<<i<<" , j = "<<j<<endl;   cout<<"k = "<<k<<" , l = "<<l<<endl; } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河间市| 葵青区| 湟源县| 秦安县| 汉沽区| 溧阳市| 中超| 江西省| 赤峰市| 当涂县| 梁山县| 芒康县| 新丰县| 孟连| 赫章县| 谢通门县| 津南区| 沙洋县| 额尔古纳市| 麻阳| 香港 | 晋州市| 巫山县| 乌鲁木齐县| 乌苏市| 宣汉县| 清河县| 南靖县| 旬邑县| 彰化县| 辛集市| 青阳县| 青冈县| 大兴区| 莎车县| 闽清县| 监利县| 延川县| 丹东市| 东明县| 瑞金市|