C++筆記 第五十六課 函式模板的概念和意義---狄泰學院
阿新 • • 發佈:2018-12-01
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第五十六課 函式模板的概念和意義
1.發散性問題
C++中有幾種交換變數的方法?
2.交換變數的方法
定義巨集程式碼塊VS定義函式
56-1 變數的交換
#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; } 執行結果 a = 1 b = 0 m = 3 n = 2 d = Tang t = Delphi
定義巨集程式碼塊
優點:程式碼複用,適合所有的型別
缺點:編譯器不知道巨集的存在,缺少型別檢查
定義函式
優點:真正的函式呼叫,編譯器對型別進行檢查
缺點:根據型別重複定義函式,無法程式碼複用
3.新的需求
C++中有沒有解決方案集合兩種方法的優點?肯定有
4.泛型程式設計
泛型程式設計的概念
不考慮具體資料型別的程式設計方式
對於Swap函式可以考慮下面的泛型寫法
Swap泛型寫法中的T不是一個具體的資料型別,而是泛指任意的資料型別。
5.函式模板(一共有兩種,函式模板和類模板)
C++中泛型程式設計
函式模板
一種特殊的函式可用不同型別進行呼叫
看起來和普通函式很相似,區別是型別可被引數化
函式模板的語法規則
template關鍵字用於宣告開始進行泛型程式設計
typename關鍵字用於宣告泛指型別
函式模板的使用
自動型別推導呼叫
具體型別顯示呼叫
56-2 函式模板使用初探
初體驗函式模板: #include <iostream> #include<string> using namespace std; template <typename T> void Swap(T& a, T& b) { T c = a; a = b; b = c; } int main() { int a = 0; int b = 1; Swap(a, b); //Swap<int>(a,b); cout << "a = " << a << endl; cout << "b = " << b << endl; double m = 2; double n = 3; Swap(m, n); //Swap<double>(a,b); cout << "m = " << m << endl; cout << "n = " << n << endl; string d = "Delphi"; string t = "Tang"; Swap(d, t); //Swap<double>(a,b); cout << "d = " << d << endl; cout << "t = " << t << endl; return 0; } 深度體驗函式模板: 11:47開始 #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; } 執行結果 5,3,2,4,1, 1,2,3,4,5, Java,C++,Pascal,Ruby,Basic, Basic,C++,Java,Pascal,Ruby,
小結
函式模板是泛型程式設計在C++中的應用方式之一
函式模板能夠根據實參對引數型別進行推導
函式模板支援顯示的指定引數型別
函式模板是C++中重要的程式碼複用方式