c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)
生活随笔
收集整理的這篇文章主要介紹了
c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
什么叫泛型編程?1. 參數類型化。 2. 模板
模板概念
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(模板概念,利用模板实现数组排序,函数模板调用规则)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星电视QA85Q70AHDMI2.1接
- 下一篇: DNF刷图力法自动出球加满不,好吧我是球