日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++学习33 函数模板

發布時間:2024/4/14 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++学习33 函数模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在《C++函數重載》一節中,為了求三個數的最大值,我們通過函數重載定義了三個名字相同、參數列表不同的函數,如下所示:

//求三個整數的最大值 int max(int a, int b, int c){if(b>a) a=b;if(c>a) a=c;return a; } //求三個浮點數的最大值 double max(double a, double b, double c){if(b>a) a=b;if(c>a) a=c;return a; } //求三個長整型數的最大值 long max(long a, long b, long c){if(b>a) a=b;if(c>a) a=c;return a; }

這些函數雖然在調用時方便了一些,但從本質上說還是定義了三個功能相同、函數體相同的函數,仍然不夠節省代碼。能不能把它們壓縮成一個呢?

能!可以借助本節講的函數模板。

我們知道,數據或數值可以通過函數參數傳遞,在函數定義時它們是未知的,只有在發生函數調用時才能確定其值。這就是數據的參數化。

其實,數據類型也可以通過參數來傳遞,在函數定義時可以不指明具體的數據類型,當發生函數調用時,編譯器可以根據傳入的參數自動確定數據類型。這就是數據類型參數化。

所謂函數模板,實際上是建立一個通用函數,其返回值類型和形參類型不具體指定,用一個虛擬的類型來代替(實際上是用一個標識符來占位)。這個通用函數就稱為函數模板(Function Template)。凡是函數體相同的函數都可以用這個模板來代替,不必定義多個函數,只需在模板中定義一次即可。在調用函數時系統會用實參的類型來取代模板中的虛擬類型,從而實現了不同函數的功能。

定義模板函數的語法為:

template <typename 數據類型參數 , typename 數據類型參數 , ...> 返回值類型 函數名(形參列表){//TODO://在函數體中可以使用數據類型參數 }

其中,template?是定義模板函數的關鍵字,template后面的尖括號不能省略;typename?是聲明數據類型參數名的關鍵字,多個數據類型參數以逗號分隔。例如,求兩個數的值:

//在返回值類型、形參列表、函數體中都可以使用T template<typename T> T sum(T a, T b){T temp = a + b;return temp; }

template<typename T>為模板頭,T為類型參數。模板函數的調用形式和普通函數一樣:

int n = sum(10, 20); float m = sum(12.6, 23.9);

編譯器可以根據調用時傳遞的參數來自動推演數據類型。

改進本節開頭的代碼,通過函數模板來求三個數的最大值。

#include <iostream> using namespace std; template<typename T> //模板頭,這里不能有分號 T max(T a, T b, T c){ //函數頭if(b>a) a=b;if(c>a) a=c;return a; } int main( ){//求三個整數的最大值int i1, i2, i3, i_max;cin >> i1 >> i2 >> i3;i_max = max(i1,i2,i3);cout << "i_max=" << i_max << endl;//求三個浮點數的最大值double d1, d2, d3, d_max;cin >> d1 >> d2 >> d3;d_max = max(d1,d2,d3);cout << "d_max=" << d_max << endl;//求三個長整型數的最大值long g1, g2, g3, g_max;cin >> g1 >> g2 >> g3;g_max = max(g1,g2,g3);cout << "g_max=" << g_max << endl;return 0; }

模板函數也可以提前聲明,不過聲明時需要帶上模板頭,請看下面的例子:

#include <iostream> using namespace std; //聲明模板函數 template<typename T> T sum(T a, T b); int main(){cout<<sum(10, 40)<<endl;return 0; } //定義模板函數 template<typename T> T sum(T a, T b){T temp = a + b;return temp; }

可以發現,模板頭和函數定義(聲明)是一個不可分割的整體,可以換行,但是中間不能有分號。

轉載于:https://www.cnblogs.com/Caden-liu8888/p/5835585.html

總結

以上是生活随笔為你收集整理的C++学习33 函数模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。