C++ 面向对象(类和对象)—— 函数模板
🎁个人主页:工藤新一¹
🔍系列专栏:C++面向对象(类和对象篇)
🌟心中的天空之城,终会照亮我前方的路
🎉欢迎大家点赞👍评论📝收藏⭐文章
文章目录
- 模板
- 一、模板简介
- 二、函数模板
- 2.1函数模板的基本语法
- 2.1.1函数模板的调用方式
- 2.2函数模板的注意事项
- 2.4函数模板案例
- 2.5普通函数和函数模板的区别
- 2.5.1隐式类型转换
- 2.6普通函数和函数模板的调用规则
- 2.7模板的局限性
- 2.7.1运算符重载
- 2.7.2具体化模板
模板
-
本阶段主要针对于==C++范式编程和STL技术==进行详细讲解,探讨 C++ 更深层的应用
template — 类模板
template — 函数模板
这两种模板的形式,在作用上是无差别的,唯一用法可能只是在于对函数模板和类模板的区分
一、模板简介
- 类型安全:模板提供了类型安全,因为编译器会在编译时检查类型错误。
- 代码重用:通过使用模板,你可以编写一次代码,然后对多种类型重用它,从而减少代码重复,提高复用性。
- 性能:模板在编译时实例化,这意味着没有运行时开销,性能通常比使用虚函数或动态类型识别(如 typeid)更好。
模板就是建立通用的摸具,大大提高复用性
- 模板的特点:
- 模板不可以直接使用,它只是一个框架
- 模板的通用并不是万能的
二、函数模板
- C++的另一种编程思想叫做泛型编程,主要利用的技术就是模板
- C++提供两种模板机制:函数模板 和 类模板
2.1函数模板的基本语法
-
函数模板的作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟类型来代表
C++ void func(int a); | | 返回值类型 形参类型 T T 使用虚拟类型T来代表
语法:template + 后紧跟 + 函数声明或定义
紧跟的这一部分(函数声明或定义)就叫做函数模板
- template ---> 声明创建模板
- typename ---> 表示其后面的符号是一种数据类型,也可以使用class代替
- T ---> 通用的数据类型,名称可替换
模板存在的意义:数据类型的参数化
- 当我们打算实现两数交换,但我们并不明确两数的数据类型,我们可以写出无数种方式
C++ 内置数据类型 void SwapInt(int& x, int& y) { int temp = x; x = y; y = temp; } void SwapDouble(double& x, double& y) { double temp = x; x = y; y = temp; } 自定义数据类型 void SwapPerson(Person& x, Person& y);...
- 但是,我们发现,除返回值类型与参数的数据类型不同外,其余代码逻辑都是相同的
- 于是函数模板就实现了
2.1.1函数模板的调用方式
C++ //声明一个模板,告诉编译器T是一个通用的数据类型,及告诉编译器模板T后紧跟着的那段代码不要报错! template void My_Swap(T& x, T& y) { T temp = x; x = y; y = x; } --->模板的使用方式: int main() { //1.自动类型推导 My_Swap(参数1, 参数2); //2.显示指定类型(推荐 - 隐式类型转换) - 明确告诉编译器你想要的数据类型 My_Swap(参数1, 参数2);--->(a, b); }
2.2函数模板的注意事项
注意事项:
- 自动类型推导,必须推导出一致的数据类型T
- 模板必须要确定T的数据类型
1.自动类型推导,必须推导出一致的数据类型T
C++ template void My_Swap(T& x, T& y) { ... } int main() { int a = 1, b = 2; char c = 'a'; My_Swap(a, b);--->true My_Swap(a, c);--->false return 0; }
2.模板必须要确定T的数据类型
C++ template void func()--->函数体 func() 是函数模板,但没有指定模板参数 T 的具体类型 { cout func();---也没有在调用 func 时提供类型参数 //如果想调用func(),那么可以给模板显示指定一个数据类型 func这样,就可以调用到func() return 0; }
2.4函数模板案例
案例描述:
-
利用函数模板封装一个排序的函数,可以对不同的数据类型进行排序
-
排序规则从大到小,排序算法为选择排序
-
分别用char数组和int数组进行排序
1.逐一解决模板,首先我们需要先建立一个排序模板
#include using namespace std; template void My_Sort(T arr[], int len) { for (int i = 0; i
2.在我们搭建排序模板的过程中,我们发现我们还需要一个支持两数交换的模板
C++ template void My_Swap(T& x, T& y) { T temp = x; x = y; y = temp; }
3.当我们所有的算法步骤解决后,我们就可以再次利用模板的方式来输出结果了
C++ //输出模板 template void My_Print(T arr[], int len) { for (int i = 0; i
-
- 当我们打算实现两数交换,但我们并不明确两数的数据类型,我们可以写出无数种方式
-
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。