【C++深度剖析教程35】函数模板的概念和意义
加qq1126137994 微信:liu1126137994 一起學習更多技術!!!
1、問題引入:
C++中有幾種變量交換的方法?
定義宏代碼塊和定義函數(shù)
#include <iostream> #include <string>using namespace std;#define SWAP(t, a, b) \ do \ { \t c = a; \a = b; \b = c; \ }while(0)void Swap(int& a, int& b) {int c = a;a = b;b = c; }void Swap(double& a, double& b) {double c = a;a = b;b = c; }void Swap(string& a, string& b) {string c = a;a = b;b = c; }int main() {int a = 0;int b = 1;Swap(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;double m = 2;double n = 3;Swap(m, n);cout << "m = " << m << endl;cout << "n = " << n << endl;string d = "Delphi";string t = "Tang";Swap(d, t);cout << "d = " << d << endl;cout << "t = " << t << endl;return 0; }上述函數(shù)是分別用宏定義與幾個函數(shù)實現(xiàn)的變量的交換的方法!!!
下面我們來分析一下他們兩個的優(yōu)缺點:
定義宏代碼塊:
優(yōu)點:
代碼復用,適合所有的類型
缺點:
宏定義是在預處理階段替換的,編譯器不知道宏的存在,無法做類型安全檢查
定義函數(shù):
優(yōu)點:
真正的函數(shù)調(diào)用,編譯器會對類型檢查
缺點:
根據(jù)類型重復定義函數(shù),無法實現(xiàn)代碼復用
2、解決方案
解決上述兩種方案的缺點:泛型編程
泛型編程:不考慮具體數(shù)據(jù)類型的編程方式!
對于上述Swap函數(shù),可以寫成下面這樣:
void Swap(T& a,T& b) {T t = a;a = b;b = t; }上述的T不是指某一個數(shù)據(jù)類型,而是泛指任意的數(shù)據(jù)類型
在C++中,泛型編程,指的就是:函數(shù)模板!!!
函數(shù)模板:
函數(shù)模板的語法規(guī)則:
- template 關鍵字用于聲明開始進行泛型編程
- typename 關鍵字用于聲明泛指類型
函數(shù)模板的使用有兩種調(diào)用方法:
下面看一個具體的示例:
#include <iostream> #include <string>using namespace std;template < typename T > void Swap(T& a, T& b) {T c = a;a = b;b = c; }template < typename T > void Sort(T a[], int len) {for (int i = 0; i<len; i++){for (int j = i; j<len; j++){if (a[i] > a[j]){Swap(a[i], a[j]);}}} }template < typename T > void Println(T a[], int len) {for (int i = 0; i<len; i++){cout << a[i] << ", ";}cout << endl; }int main() {int a[5] = { 5, 3, 2, 4, 1 };Println(a, 5);Sort(a, 5);Println(a, 5);string s[5] = { "Java", "C++", "Pascal", "Ruby", "Basic" };Println(s, 5);Sort(s, 5);Println(s, 5);return 0; }運行結果為:
從而可以看出函數(shù)模板的強大,我們只需要寫出一個函數(shù),就可以使用任意的數(shù)據(jù)類型!!!
3、總結
總結
以上是生活随笔為你收集整理的【C++深度剖析教程35】函数模板的概念和意义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内蒙古银行银行招聘计算机研究生,内蒙古银
- 下一篇: java api 8 中文_java8