ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C++学习日记 Day12:模板-函数模板

C++学习日记 Day12:模板-函数模板 ## 今天学了什么今天学习C的模板-函数模板在C中除了面向对象编程思想外还有泛型编程主要利用的技术就是模板。## 模板特点①模板不可以直接使用只是一个框架②模板的通用并不是万能的优点提高复用性将类型参数化。分类C提供两种模板函数模板和类模板。### 函数模板定义建立一个通用函数其函数返回值和形参类型可以不具体制定用一个虚拟类型代表。语法templatetypename T // typename 可以用class代替templatetypename T void Myswap(T a, T b) { T temp a; a b; b temp; }函数模板的使用方式①自动类型推导int a 50; int b 10; Myswap(a, b);②显示指定类型int a 50; int b 10; Myswapint(a, b);注①在使用自动类型推导方式时必须确定参数的数据类型相同②使用函数模板必须确定T的类型才可以使用如果函数模板暂时没有使用参数仍想调用它例templatetypename T void func() { cout func 的函数 endl; }funcint();### 普通函数与函数模板区别普通函数调用时可以发生自动类型转换隐式转换函数模板调用方式使用自动类型推导不会发生隐式类型转换函数模板调用方式使用显示制定指定类型方式可以发生隐式类型转换。验证//普通函数 int Myadd(int a, int b) { return a b; } //函数模板 templatetypename T T Myadd02(T a, T b) { return a b; } void test() { int a 10; int b 10; char c c; Myadd02int(a, c); cout Myadd(a, c)endl; }观察发现调用普通函数以及通过显示指定类型使用函数模板在Myadd/Myadd02下一个断点进入调试发现传入的字符类型会转成int型输出结果109,c:ascii 99而自动类型推导方式会因为 int 和 char 推导冲突而报错无法使用。### 普通函数和函数模板的调用规则如果函数模板和普通函数都可以实现优先调普通函数可以通过空模板参数列表来强制调用函数模板函数模板也可以发生重载如果函数模板可以产生更好的匹配优先调用函数模板。验证void func(int a,int b) { cout 普通函数 func endl; } templatetypename T void func(T a,T b) { cout 函数模版 func endl; } templatetypename T void func(T a,T b,T c) { cout 函数模版重载 func endl; } void test() { func(1,1);// 1-普通函数 func(1,1);//2-函数模板 func(1, 1,1);//3-重载 函数模板 char a a; char b b; func(a, b);//4- 效果更好优先匹配函数模板 减少转换成int }### 模板的局限性有些特定的数据类型需要用具体化方式做特殊实现解决方法重载模板 具体化模板 解决自定义类的通用化。//特殊自定义类 class Person { public: Person(string n, int na) { name n; num na; } int num; string name; }; templatetypename T bool MyCompare(T a, T b) { if (a b) { return true; } else{ return false; } } //具体化模板 用于自定义类 templatebool MyCompare(Person a, Person b) { if (a.name b.namea.numb.num) { return true; } else { return false; } } void test() { int a 10; int b 10; if (MyCompare(a, b)) { cout ab endl; } else { cout a!b endl; } Person p1(张三,18); Person p2(张三, 18); if (MyCompare(p1, p2)) { cout endl; } else { cout ! endl; } }## 练习** 数组排序 **利用函数模板MySort将传入的数组进行从大到小排序templatetypename 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 (arr[i] ! arr[max]) { //交换数值 int temp arr[i]; arr[i] arr[max]; arr[max] temp; } } } void text() { //int num[] { 1,9,4,8,2,7,6,5,3 }; char num[] acbdfgshku; //char num[] 125839467; int len sizeof(num) / sizeof(char); MySort(num, len); for (int i 0; i len; i) { cout num[i] ; } cout endl; }运行结果按从大到小排序。
返回列表