C++(十)——模板(上)
生活随笔
收集整理的這篇文章主要介紹了
C++(十)——模板(上)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數模板基本語法
#include<iostream> using namespace std;//兩個整型交換函數 //函數模板 template<typename T> //聲明模板void mySwap(T& a, T& b) {T temp = a;a = b;b = temp; } void test01() {int a = 10;int b = 20;//自動類型推導//mySwap(a, b);//顯示指定類型mySwap<int>(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl; } int main() {test01(); }函數模板注意事項
#include<iostream> using namespace std; template<class T>//typename可以替換成class void mySwap(T& a, T& b) {T temp = a;a = b;b = temp; }//函數模板注意事項 //1、自動類型推導,必須推導出一致的數據類型T才可以使用 void test01() {int a = 10;int b = 20;char c = 'c';//mySwap(a, b);//mySwap(a, c);推導不出一致的T類型cout << "a = " << a << endl;cout << "b = " << b << endl; } //2、模板必須要確定出T的數據,才可以使用 template <class T> void func() {cout << "fuc的調用" << endl; } void test02() {func<int>(); }int main() {test01();test02();system("pause");return 0; }函數模板案例
#include<iostream> using namespace std; //實現一個通用的對數組的排序模板函數 template<typename T> void sort(T a[], int n) {for (int i = 0; i < n - 1 ; ++i) {int k = i;for (int j = k + 1; j < n; ++j) {if (a[j] < a[k]) {k = j;}}if (k != i) {T t = a[k];a[k] = a[i];a[i] = t;}} }template<typename T> void printArray(T a[], int n) {for (int i = 0; i < 10; ++i) {cout << a[i] << endl;}cout << endl; }void test01() {int a[10] = { 4,2,1,5,3,7,8,10,6,9 };sort(a, 10);//printArray(a, 10);char c[] = "safjsfjid";int num = sizeof(c) / sizeof(char);sort(c, num);printArray(c, num); }int main() {test01();return 0; }普通函數與函數模板區別
#include<iostream> using namespace std; //普通函數與函數模板的區別 //普通函數調用可以發生隱式類型轉換 //函數模板用顯示指定類型,可以發生隱式類型轉換 //函數模板用自動類型推導,不可以發生隱式類型轉換//普通函數 int myAdd01(int a, int b) {return a + b; } //函數模板 template<typename T> T myAdd02(T a, T b) {return a + b; } void test01() {int a = 10;int b = 20;char c = 'c';cout << myAdd01(a, c) << endl;//自動類型推導 不會發生隱式類型轉換//cout << myAdd02(a, c) << endl;//顯示指定類型cout << myAdd02<int>(a, c) << endl;}int main() {test01();return 0; }普通函數與函數模板調用規則
#include<iostream> using namespace std;//普通函數與函數模板的調用規則 //1 函數模板與普通函數同名 優先調用普通函數 //2 可以通過空模板參數列表 強制調用 函數模板 //3 函數模板可以發生函數重載 //4 如果函數模板可以產生更好的匹配,優先調用函數模板 void myPrint(int a, int b) {cout << "調用普通函數" << endl; }template<typename T> void myPrint(T a, T b) {cout << "調用模板函數" << endl; }template<typename T> void myPrint(T a, T b, T c) {cout << "調用重載模板函數" << endl; }void test01() {myPrint(1, 3);//通過空模板的參數列表,強制調用函數模板myPrint<>(1, 3);//模板函數也能重載myPrint(1, 2, 3);//如果函數模板產生更好的匹配優先調用函數模板myPrint('1', '2'); }int main() {test01();return 0; }模板的局限性
#include<iostream> using namespace std; //模板的局限性 //模板并不是萬能的,有些特定數據類型,需要具體化方式做特殊實現class Person { public:string m_name;int m_age;Person(string name, int age) {m_name = name;m_age = age;} };//對比兩個數據是否相等函數 template<class T> bool myCompare(T& a, T& b) {if (a == b)return true;return false;}//利用具體化Person的版本實現代碼,具體化優先調用 template<> bool myCompare(Person& p1, Person& p2) {if (p1.m_name == p2.m_name && p1.m_age == p2.m_age)return true;return false; }void test02() {Person p1("tom", 12);Person p2("tom", 132);bool ret = myCompare(p1, p2);if (ret)cout << "p1等于p2" << endl;elsecout << "p1不等于p2" << endl; }void test01() {int a = 10;int b = 20;bool ret = myCompare(a, b);if (ret)cout << "a等于b" << endl;elsecout << "a不等于b" << endl;}int main() {//test01();test02();return 0; }函數模板案例
#include<iostream> using namespace std; //實現一個通用的對數組的排序模板函數 template<typename T> void sort(T a[], int n) {for (int i = 0; i < n - 1 ; ++i) {int k = i;for (int j = k + 1; j < n; ++j) {if (a[j] < a[k]) {k = j;}}if (k != i) {T t = a[k];a[k] = a[i];a[i] = t;}} }template<typename T> void printArray(T a[], int n) {for (int i = 0; i < 10; ++i) {cout << a[i] << endl;}cout << endl; }void test01() {int a[10] = { 4,2,1,5,3,7,8,10,6,9 };sort(a, 10);//printArray(a, 10);char c[] = "safjsfjid";int num = sizeof(c) / sizeof(char);sort(c, num);printArray(c, num); }int main() {test01();return 0; }總結
以上是生活随笔為你收集整理的C++(十)——模板(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++(九)——职工信息管理系统
- 下一篇: 01. 对称密码——算法