C++学习33 函数模板
在《C++函數(shù)重載》一節(jié)中,為了求三個(gè)數(shù)的最大值,我們通過函數(shù)重載定義了三個(gè)名字相同、參數(shù)列表不同的函數(shù),如下所示:
//求三個(gè)整數(shù)的最大值 int max(int a, int b, int c){if(b>a) a=b;if(c>a) a=c;return a; } //求三個(gè)浮點(diǎn)數(shù)的最大值 double max(double a, double b, double c){if(b>a) a=b;if(c>a) a=c;return a; } //求三個(gè)長整型數(shù)的最大值 long max(long a, long b, long c){if(b>a) a=b;if(c>a) a=c;return a; }這些函數(shù)雖然在調(diào)用時(shí)方便了一些,但從本質(zhì)上說還是定義了三個(gè)功能相同、函數(shù)體相同的函數(shù),仍然不夠節(jié)省代碼。能不能把它們壓縮成一個(gè)呢?
能!可以借助本節(jié)講的函數(shù)模板。
我們知道,數(shù)據(jù)或數(shù)值可以通過函數(shù)參數(shù)傳遞,在函數(shù)定義時(shí)它們是未知的,只有在發(fā)生函數(shù)調(diào)用時(shí)才能確定其值。這就是數(shù)據(jù)的參數(shù)化。
其實(shí),數(shù)據(jù)類型也可以通過參數(shù)來傳遞,在函數(shù)定義時(shí)可以不指明具體的數(shù)據(jù)類型,當(dāng)發(fā)生函數(shù)調(diào)用時(shí),編譯器可以根據(jù)傳入的參數(shù)自動確定數(shù)據(jù)類型。這就是數(shù)據(jù)類型參數(shù)化。
所謂函數(shù)模板,實(shí)際上是建立一個(gè)通用函數(shù),其返回值類型和形參類型不具體指定,用一個(gè)虛擬的類型來代替(實(shí)際上是用一個(gè)標(biāo)識符來占位)。這個(gè)通用函數(shù)就稱為函數(shù)模板(Function Template)。凡是函數(shù)體相同的函數(shù)都可以用這個(gè)模板來代替,不必定義多個(gè)函數(shù),只需在模板中定義一次即可。在調(diào)用函數(shù)時(shí)系統(tǒng)會用實(shí)參的類型來取代模板中的虛擬類型,從而實(shí)現(xiàn)了不同函數(shù)的功能。
定義模板函數(shù)的語法為:
template <typename 數(shù)據(jù)類型參數(shù) , typename 數(shù)據(jù)類型參數(shù) , ...> 返回值類型 函數(shù)名(形參列表){//TODO://在函數(shù)體中可以使用數(shù)據(jù)類型參數(shù) }其中,template?是定義模板函數(shù)的關(guān)鍵字,template后面的尖括號不能省略;typename?是聲明數(shù)據(jù)類型參數(shù)名的關(guān)鍵字,多個(gè)數(shù)據(jù)類型參數(shù)以逗號分隔。例如,求兩個(gè)數(shù)的值:
//在返回值類型、形參列表、函數(shù)體中都可以使用T template<typename T> T sum(T a, T b){T temp = a + b;return temp; }template<typename T>為模板頭,T為類型參數(shù)。模板函數(shù)的調(diào)用形式和普通函數(shù)一樣:
int n = sum(10, 20); float m = sum(12.6, 23.9);編譯器可以根據(jù)調(diào)用時(shí)傳遞的參數(shù)來自動推演數(shù)據(jù)類型。
改進(jìn)本節(jié)開頭的代碼,通過函數(shù)模板來求三個(gè)數(shù)的最大值。
#include <iostream> using namespace std; template<typename T> //模板頭,這里不能有分號 T max(T a, T b, T c){ //函數(shù)頭if(b>a) a=b;if(c>a) a=c;return a; } int main( ){//求三個(gè)整數(shù)的最大值int i1, i2, i3, i_max;cin >> i1 >> i2 >> i3;i_max = max(i1,i2,i3);cout << "i_max=" << i_max << endl;//求三個(gè)浮點(diǎn)數(shù)的最大值double d1, d2, d3, d_max;cin >> d1 >> d2 >> d3;d_max = max(d1,d2,d3);cout << "d_max=" << d_max << endl;//求三個(gè)長整型數(shù)的最大值long g1, g2, g3, g_max;cin >> g1 >> g2 >> g3;g_max = max(g1,g2,g3);cout << "g_max=" << g_max << endl;return 0; }模板函數(shù)也可以提前聲明,不過聲明時(shí)需要帶上模板頭,請看下面的例子:
#include <iostream> using namespace std; //聲明模板函數(shù) template<typename T> T sum(T a, T b); int main(){cout<<sum(10, 40)<<endl;return 0; } //定義模板函數(shù) template<typename T> T sum(T a, T b){T temp = a + b;return temp; }可以發(fā)現(xiàn),模板頭和函數(shù)定義(聲明)是一個(gè)不可分割的整體,可以換行,但是中間不能有分號。
轉(zhuǎn)載于:https://www.cnblogs.com/Caden-liu8888/p/5835585.html
總結(jié)
以上是生活随笔為你收集整理的C++学习33 函数模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: strace oracle
- 下一篇: js实现无限极分类