函數模板屬于類屬,能夠處理不同的數據類型,當編譯器遇到函數調用是,將根據實際參數的類型產生特定的代碼,函數模板的定義形式是:
template <類型參數表>
返回值類型 函數名(形式參數表){
//函數體
}
函數模板可以為我們提供很多方便
函數重載的例子:
int square(int number){return number*number;
}float square(float number){return number*number;
}
上述兩個函數之間的區別是參數類型和返回值類型不一樣,這種情況下我們使用函數模板更加方便。
通過函數模板實現square函數
template <class T>
T square(T number){return number*number;
}
只要寫一個函數定義就可以處理不同的數據類型,而不需要對每種數據類型都寫一個單獨的函數。
eg1:
#include<iostream>
using namespace std;template <class T>
T square(T number){return number*number;
} int main(){int userInt;float userFloat;cout.precision(5);cout<<"請輸入一個整數和一個浮點數:";cin>>userInt>>userFloat;cout<<"他們的平方分別是:";cout<<square(userInt)<<"和"<<square(userFloat)<<endl;return 0;
}
注:①函數模板本身不占用內存,當編譯器遇到函數調用是,將在內存中創建一個函數實例。②模板的定義必須放在函數調用之前,通常放在程序的開頭或者位于頭文件中。
具有多個參數的函數模板:
template <class T>
void swapData(T &var1,T &var2){T temp;temp=var1;var1=var2;var2=temp;
}
函數模板不是一個真正意義上的函數,它僅僅是一個函數模型,當編譯器遇到函數調用是,將依據模板給出的代碼,通過檢驗參數的數據類型,產生重載函數。
具有多種類型的函數模板
template <class T1,class T2>
void swapData(T1 &var1,T2 &var2){T1 temp;temp=var1;var1=var2;var2=temp;
}
函數模板也支持重載
template <class T>
T sum(T var1,T var2){return var1+var2;
}template <class T>
T sum(T var1,T var2,T var3){return var1+var2+var3;
}
當程序中有一個普通的函數(非模板),同時定義了一個模板,只要他們的參數列表不同,他們也能作為重載函數的形式共存。
float sum(float var1,float var2){return var1+var2;
}template <class T>
T sum(T var1,T var2,T var3){return var1+var2+var3;
}
這也屬于模板重載,當程序執行是,將根據實際調用的參數進行區分。