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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)

發布時間:2023/11/30 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么叫泛型編程?1. 參數類型化。 2. 模板

模板概念

c++提供了函數模板,所謂函數模板,實際上是建立一個通用函數,其函數類型和形參類型不具體制定,用一個虛擬的類型來代表。這個通用函數就成為函數模板。凡是函數體相同的函數都可以用這個模板代替,不必定義多個函數,只需在模板中定義一次即可。在調用函數時系統會根據實參的類型來取代模板中的虛擬類型,從而實現不同函數的功能。

  • c++提供兩種模板機制:函數模板類模板
  • 類屬–類型參數化,又稱參數模板
  • 總結

  • 模板把函數或類要處理的數據類型參數化,表現為參數的多態性,成為類屬
  • 模板用于表達邏輯結構相同,但具體數據元素類型不同的數據對象的通用行為。
  • 函數模板

  • template <class / typename T> 告訴編譯器緊跟的代碼出現T不要報錯

  • 類型也需要傳入,類型參數化

  • 自動類型推導

  • 顯示指定類型

    #include<iostream>using namespace std;//交換int 類型的兩個文字void mySwaoInt(int &a, int &b){int tmp = a;a = b;b = tmp;}//交換double的數據void mySwapDouble(double &a, double &b){double tmp = a;a = b;b = tmp;}//類型,邏輯又非常相似//類型參數化,泛型編程--模板技術template<class T>//告訴編譯器 下面如果出現T不要報錯,T是一個通用的類型void mySwap(T &a, T &b){T tmp = a;a = b;b = tmp;}//template<typename T> 等價于template<class T>template<typename T>void mySwap2(){};void test01(){int a = 10;int b = 20;char c1 = 'c';//mySwaoInt(a, b);//1. 自動類型推導,必須有參數類型才可以推導//2.參數類型必須一樣//mySwap(a, c1);//推導不出來T,所以不能運行mySwap(a, b);//2.顯示指定類型mySwap<int >(a, b);//模板必須要指定出T才可以使用mySwap2<double>();cout << "a=" << a << endl;cout << "b=" << b << endl;double c = 3.14;double d = 1.1;//mySwaoInt(a, b);mySwap(c, d);}int main(){test01();system("pause");return 0;}
  • 利用模板實現數組排序

    #include<iostream>using namespace std;//對char 和 int 數組進行排序 ,排序規則 從大到小 利用選擇排序template<class T>void mySwap(T &a, T &b){T tmp = a;a = b;b = tmp;}template<class T>void mySort( T arr[], int len){//選擇排序for (int i = 0; i < len; i++){int max = i;for (int j = i + 1; j < len; j++){if (arr[max] < arr[j]){//交換 下標max = j;}}if (max != i){//交換數據mySwap(arr[max], arr[i]);}}}//輸出數組元素的模板template <class T>void printArray(T arr[], int len){for (int i = 0; i < len; i++){cout << arr[i] << " "; }cout << endl;}void test01(){char charArr[] = "helloword";int num = sizeof(charArr) / sizeof(char);mySort(charArr, num);printArray(charArr, num);int intArr[] = { 1, 4, 100, 34, 55 };int num2 = sizeof(intArr) / sizeof(int);mySort(intArr, num2);printArray(intArr, num2);}int main(){test01();system("pause");return 0;}

    函數模板和普通安徽念書在一起調用規則

    區別 :普通函數可以進行隱式類型轉換,模板不行。

  • c++編譯器優先考慮普通函數

  • 可以通過空模板實參列表的語法限定編譯器只能通過模板匹配

  • 函數模板可以像普通函數那樣可以被重載

  • 如果函數模板可以產生一個更好的匹配,那么選擇模板

    #include<iostream>using namespace std;//1. 普通模板與函數模板區別template <class T>T myPlus(T a, T b){return a + b;}int myPlus2(int a, int b){return a + b;}void test01(){int a = 10;int b = 20;char c = 'c';//a=97.c=99//myPlus(a, c);//類型推導不出來cout << myPlus2(a, c) << endl;//10+99 普通函數 可以進行隱式類型轉換}//2. 普通函數和函數模板的調用規則template<class T>void myPrint(T a, T b){cout << "模板調用的myPrint" << endl;}template<class T>void myPrint(T a, T b,T c){cout << "模板調用的myPrint(a,b,c)" << endl;}void myPrint(int a, int b){cout << "普通的函數調用myPrint" << endl;}void test02(){int a = 10;int b = 20;//如果出現重載,優先使用普通模板的調用,如果沒有實現普通函數,出現錯誤//myPrint(a, b);//如果想強制調用模板,那么可以使用空參數列表myPrint<>(a, b);//3. 函數模板可以發生重載int c = 30;myPrint(a, b, c);//如果函數模板可以產生更好的匹配,那么優先使用函數模板char e = 'c';char d = 'd';myPrint(c, d);}int main(){//test01();test02();system("pause");return 0;}
  • 總結

    以上是生活随笔為你收集整理的c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)的全部內容,希望文章能夠幫你解決所遇到的問題。

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