网站设计的主题顺德网络营销网站
网站设计的主题,顺德网络营销网站,指数计算器,大连网站制作学校Linux C 022-函数模板
本节关键字#xff1a;Linux、C、函数模板、泛型编程 相关库函数#xff1a;
函数模板的用法
C另一种编程思想称为泛型编程#xff0c;主要利用的技术就是模板#xff0c;C提供两种模板机制#xff1a;函数模板和类模板函数模板的作用#xff1a…Linux C 022-函数模板
本节关键字Linux、C、函数模板、泛型编程 相关库函数
函数模板的用法
C另一种编程思想称为泛型编程主要利用的技术就是模板C提供两种模板机制函数模板和类模板函数模板的作用建立一个通用函数其函数返回值类型和形参类型可以不具体制定用一个虚拟的类型来代表
templatetypename T函数声明或定义
template -- 声明创建模板
typename -- 声明其后面的符号是一种数据类型可以用class代替
T -- 通用的数据类型名称可以替换通常为大写字母// 声明一个模板告诉编译器后面代码中紧跟着的T不要报错T是一个通用数据类型
templatetypename T
void mySwap(T a, T b)
{T temp a;a b;b temp;
}void test01()
{int a 10;int b 20;//1、自动类型推导mySwap(a, b);//2、显示指定类型mySwapint(a, b);
}函数模板总结
1函数模板利用关键字template
2使用函数模板有两种方式自动类型推导、显示指定类型
3模板的目的是为了提高复用性将类型参数化函数模板注意事项
1自动类型推导必须推导出一致的数据类型T才可以使用
2模板必须要确定出T的数据类型才可以使用函数模板案例
案例描述 1利用函数模板封装一个排序的函数可以对不同数据类型数据进行排序 2排序规则从大到小排序算法为选择排序 3分别利用char数组和int数组进行测试
// 泛化版本
templatetypename T, typename U
void mySwap(T a, U b)
{cout a endl;cout b endl;
}
//全特化版本内为空
template
void mySwapint, double(int a, double b)
{cout a endl;cout b endl;
}//class也可换成typename
templateclass T
void mySort(T arr[], int len)
{for(int i0;ilen;i){int max i;for(int ji1;jlen;j){if(arr[max] arr[j]){max j;}}if(max ! i){mySwapint(arr[max], arr[i]);}}
}templateclass T
void printArray(T arr[], int len)
{for(int i0;ilen;i){cout arr[i] endl;}
}void test01()
{char charArr[] abcdefint num sizeof(charArr) / sizeof(charArr[0]);mySortchar(charArr, num);printArraychar(charArr, num);
}void test02()
{int intArr[] {1, 2, 4, 3, 6};int num sizeof(intArr) / sizeof(intArr[0]);mySortint(intArr, num);printArrayint(intArr, num);
}普通函数与函数模板的区别
1普通函数调用时可以发生自动类型转换隐式类型转换 2函数模板调用时如果利用自动类型推到不会发生隐式类型转换 3如果利用显示类型的方式可以发生隐式类型转换
// 普通函数
int mySAdd01(int a, int b)
{return ab;
}// 函数模板
templateclass T
T myAdd02(T a, T b)
{return ab;
}// 使用函数模板是如果用自动类型推导不会发生自动类型转换即隐式类型转换
void test01()
{int a 10;int b 20;char c c;cout myAdd01(a, b) endl; // 30cout myAdd01(a, c) endl; // 109cout myAdd02(a, b) endl; // 30cout myAdd02(a, c) endl; // 报错cout myAdd02int(a, c) endl; // 109
}
// 建议使用显示指定类型的方式调用函数模板因为可以自己确定通用类型T普通函数与函数模板的调用规则
1如果函数模板和普通函数都可以实现优先调用普通函数 2可以通过空模板参数列表来强制调用函数模板 3函数模板也可以发生重载 4如果函数模板可以产生更好的匹配有限调用函数模板
void myPrint(int a, int b)
{cout 调用普通函数 endl;
}templatetypename T
void myPrint(T a, T b)
{cout 调用函数模板 endl;
}templatetypename T
void myPrint(T a, T b, T c)
{cout 调用重载的函数模板 endl;
}void test01()
{int a 10;int b 20;myPrint(a, b); // 调用普通函数myPrint(a, b); // 调用函数模板myPrint(a, b, 100); // 调用重载的函数模板
}void test02()
{char a c;char b d;myPrint(a, b); // 调用函数模板
}总结既然提供了函数模板就不要再提供普通函数了否则容易出现二义性
模板的局限性
模板的通用性并不是万能的例如
template class T
void f(T a, T b)
{a b;
}在上述代码中提供的赋值操作如果传入的a和b是一个数组就无法实现了再例如
template class T
void (T a, T b)
{if(a b){ ... };
}在上述代码中如果T的数据类型传入的是像Person这样的自定义数据类型也无法正常运行因此C为了解决这种问题提供模板的重载可以为这些特定的类型提供具体化的模板
示例对比两个数据是否相等的函数
class Person
{
public:person(string name, int age){m_Name name;m_Age age;}string m_Name;int m_Age;
};template class T)
bool myCompare(T a, T b)
{if(a b)return true;elsereturn false;
}void test01()
{int a 10;int b 20;bool ret myCompare(a, b);if(ret)cout a b endl;elsecout a ! b endl;
}
void test02()
{Person p1(Tom, 10);Person p2(Tom, 10);bool ret myCompare(p1, p2);if(ret)cout p1 p2 endl;elsecout p1 ! p2 endl;
}// 利用具体化Person的版本实现代码具体化 优先使用
template bool myCompare(Person p1, Person p2)
{if(p1.m_Name p2.m_Name p1.m_Age p2.m_Age)return true;elsereturn false;
}总结
1、利用具体化的模板可以解决自定义类型的通用化
2、学习模板并不是为了写模板而是在STL能够运用系统提供的模板
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89019.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!