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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

【C++深度剖析教程35】函数模板的概念和意义

發布時間:2023/12/10 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++深度剖析教程35】函数模板的概念和意义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

加qq1126137994 微信:liu1126137994 一起學習更多技術!!!

1、問題引入:

C++中有幾種變量交換的方法?

定義宏代碼塊和定義函數

#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; }

上述函數是分別用宏定義與幾個函數實現的變量的交換的方法!!!

下面我們來分析一下他們兩個的優缺點:
定義宏代碼塊:
優點:
代碼復用,適合所有的類型
缺點:
宏定義是在預處理階段替換的,編譯器不知道宏的存在,無法做類型安全檢查

定義函數:
優點:
真正的函數調用,編譯器會對類型檢查
缺點:
根據類型重復定義函數,無法實現代碼復用

2、解決方案

解決上述兩種方案的缺點:泛型編程
泛型編程:不考慮具體數據類型的編程方式!

對于上述Swap函數,可以寫成下面這樣:

void Swap(T& a,T& b) {T t = a;a = b;b = t; }

上述的T不是指某一個數據類型,而是泛指任意的數據類型

在C++中,泛型編程,指的就是:函數模板!!!
函數模板:

  • 一種特殊函數,可用不同類型進行調用
  • 看起來和普通函數類似,區別是類型可被參數化
  • template <typename T> void Swap(T& a, T& b) {T t = a;a = b;b = t; }

    函數模板的語法規則:

    • template 關鍵字用于聲明開始進行泛型編程
    • typename 關鍵字用于聲明泛指類型

    函數模板的使用有兩種調用方法:

  • 自動類型推導調用
  • 具體類型顯示調用
  • 下面看一個具體的示例:

    #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; }

    運行結果為:

    從而可以看出函數模板的強大,我們只需要寫出一個函數,就可以使用任意的數據類型!!!

    3、總結

  • 函數模板是泛型編程在C++中的應用之一
  • 函數模板能夠根據實參對參數類型進行推導
  • 函數模板支持顯示的指定參數類型
  • 函數模板是C++中重要的代碼復用的方式
  • 總結

    以上是生活随笔為你收集整理的【C++深度剖析教程35】函数模板的概念和意义的全部內容,希望文章能夠幫你解決所遇到的問題。

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