大沥网站开发,电商平面设计,网站建设网络门户,导航类网站模板 作者简介#xff1a;დ旧言~#xff0c;目前大二#xff0c;现在学习Java#xff0c;c#xff0c;c#xff0c;Python等 座右铭#xff1a;松树千年终是朽#xff0c;槿花一日自为荣。 目标#xff1a;了解什么是模板#xff0c;并且能熟练运用函数模… 作者简介დ旧言~目前大二现在学习JavaccPython等 座右铭松树千年终是朽槿花一日自为荣。 目标了解什么是模板并且能熟练运用函数模板和类模板 毒鸡汤对别人要求松一点就不会总失望对自己要求严一点就不会总沮丧。 望小伙伴们点赞收藏✨加关注哟 前言 想必大家都遇到过这样的问题吧当你要调用一个相加的函数而你的数据有整形浮点型只能实现两个函数来满足要求这样实现的话代码过于冗余。简单来说太烦了用起来太不爽调用一个函数实现一个函数。在C嘎嘎里就有了模板这个东东针不戳今天给大家带来便是c的模板学完这个c的代码真的爽不信你看 ⭐主体
咱们就从三个方面讲解函数模板类模板拓展。 模板 我们知道模板分为两大类一个是函数模板另一个则是类模板咱们先看看这块肉长啥样才方便我们吃。 下面就是一个简单的交换元素的模板 如果在C中也能够存在这样一个模具通过给这个模具中填充不同材料(类型)来获得不同材料的铸件(即生成具体类型的代码那将会节省许多头发。巧的是前人早已将树栽好我们只需在此乘凉。
函数模板 概念 函数模板代表了一个函数家族该函数模板与类型无关在使用时被参数化根据实参类型产生 函数的特定类型版本。 函数模板格式 templatetypename T1, typename T2,......,typename Tn 返回值类型 函数名 ( 参数列表 ){} templatetypename T
void Swap( T left, T right)
{T temp left;left right;right temp;
} 注意 typename 是 用来定义模板参数 关键字 也可以使用 class( 切记不能使用 struct 代替class) 既然在c我们可以使用模板那模板在底层是如何实现的捏 函数模板是一个蓝图它本身并不是函数是编译器用使用方式产生特定具体类型函数的模具。 所以其实模板就是将本来应该我们做的重复的事情交给了编译器。所以说苦了编译器开心了程序员。 简单说就是本来我们应该多去写的Swap的重复工作去给编译器做了咱们看看编译器下是如何实现的 在编译器编译阶段 对于模板函数的使用 编译器需要根据传入的实参类型来推演生成对应类型 的函数 以供调用。比如 当用 double 类型使用函数模板时编译器通过对实参类型的推演将 T 确定为 double 类型然后产生一份专门处理 double 类型的代码 对于字符类型也是如此。 函数模板的实例化
用不同类型的参数使用函数模板时 称为函数模板的实例化 。模板参数实例化分为 隐式实例化 和显式实例化 。 1. 隐式实例化让编译器根据实参推演模板参数的实际类型 2. 显式实例化在函数名后的 中指定模板参数的实际类型 如果类型不匹配编译器会尝试进行隐式类型转换如果无法转换成功编译器将会报错。 模板参数的匹配原则 1. 一个非模板函数可以和一个同名的函数模板同时存在而且该函数模板还可以被实例化为这 个非模板函数 就比如一个模板的Add和一个自己实现的Add可以一起存在然后 void Test (){ Add ( 1 , 2 ); // 与非模板函数匹配编译器不需要特化 Add int ( 1 , 2 ); // 调用编译器特化的 Add 版本} 2. 对于非模板函数和同名函数模板如果其他条件都相同在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数 那么将选择模板。简单说会先找自己实现的有没有没有就去看模板能不能实例化一个。 模板函数不允许自动类型转换但普通函数可以进行自动类型转换 类模板
类模板格式
templateclass T1, class T2, ..., class Tnclass 类模板名{ // 类内成员定义};
这里就习惯用上class上面函数模板是typename。
类模板的实例化 类模板实例化与函数模板实例化不同 类模板实例化需要在类模板名字后跟 然后将实例化的 类型放在 中即可类模板名字不是真正的类而实例化的结果才是真正的类 。 结束语 今天内容就到这里啦时间过得很快大家沉下心来好好学习会有一定的收获的大家多多坚持嘻嘻成功路上注定孤独因为坚持的人不多。那请大家举起自己的小说手给博主一键三连有你们的支持是我最大的动力回见。