• C嘎嘎模板


    > 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
    > 座右铭:松树千年终是朽,槿花一日自为荣。

    > 目标:了解什么是模板,并且能熟练运用函数模板和类模板

    > 毒鸡汤:对别人要求松一点,就不会总失望;对自己要求严一点,就不会总沮丧。
    > 望小伙伴们点赞👍收藏✨加关注哟💕💕 

    🌟前言

            想必大家都遇到过这样的问题吧,当你要调用一个相加的函数,而你的数据有整形,浮点型,只能实现两个函数来满足要求,这样实现的话,代码过于冗余。简单来说太烦了,用起来太不爽,调用一个函数,实现一个函数。在C嘎嘎里就有了模板这个东东,针不戳,今天给大家带来便是c++的模板,学完这个c++的代码真的爽,不信你看:

     ⭐主体

    咱们就从三个方面讲解,函数模板,类模板,拓展。😘😘



    🌙模板

            我们知道模板分为两大类,一个是函数模板,另一个则是类模板,咱们先看看这块肉长啥样,才方便我们吃。

    下面就是一个简单的交换元素的模板

            如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码),那将会节省许多头发。巧的是前人早已将树栽好,我们只需在此乘凉。

    🌙函数模板

    💦概念:

    函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本。
    💦函数模板格式:
    template
    返回值类型 函数名 ( 参数列表 ){}

    1. template<typename T>
    2. void Swap( T& left,  T& right) 
    3. {
    4.     T temp = left;
    5.     left = right;
    6.     right = temp; 
    7. }

    注意: typename 是 用来定义模板参数 关键字 , 也可以使用 class( 切记:不能使用 struct 代替class)

    既然在c++我们可以使用模板,那模板在底层是如何实现的捏🙊🙊🙊

            函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。 所以其实模板就是将本来应该我们做的重复的事情交给了编译器。所以说苦了编译器,开心了程序员。👻👻

            简单说就是本来我们应该多去写的Swap的重复工作去给编译器做了,咱们看看编译器下是如何实现的?

            在编译器编译阶段 ,对于模板函数的使用, 编译器需要根据传入的实参类型来推演生成对应类型 的函数 以供调用。比如: 当用 double 类型使用函数模板时,编译器通过对实参类型的推演,将 T 确定为 double 类型,然后产生一份专门处理 double 类型的代码 ,对于字符类型也是如此。

    💫函数模板的实例化

    用不同类型的参数使用函数模板时 ,称为函数模板的实例化 。模板参数实例化分为: 隐式实例化 和显式实例化 。
    1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
    2. 显式实例化:在函数名后的 <> 中指定模板参数的实际类型

    如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

    💫模板参数的匹配原则

    1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这 个非模板函数
    就比如一个模板的Add和一个自己实现的Add可以一起存在然后:

    1. void Test ()
    2. {
    3.       Add ( 1 , 2 );              // 与非模板函数匹配,编译器不需要特化
    4.       Add < int > ( 1 , 2 );   // 调用编译器特化的 Add 版本
    5. }

    2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。简单说会先找自己实现的有没有,没有就去看模板能不能实例化一个。

    模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

    🌙类模板

    类模板格式:

    1. template
    2. class 类模板名
    3. {
    4.     // 类内成员定义
    5. };

    这里就习惯用上class,上面函数模板是typename。

    💫类模板的实例化 

            类模板实例化与函数模板实例化不同, 类模板实例化需要在类模板名字后跟 <> ,然后将实例化的 类型放在 <> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类 。 

     🌟结束语

           今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

  • 相关阅读:
    这几个好用的去图片水印免费软件,你们知道吗?
    关于宝宝过敏原检测的这几点,专家达成共识啦
    Python利用pandas、request写自动化读取测试用例脚本
    3.最长升序子序列 (动态规划)
    【云原生 • Docker】docker 环境搭建、docker 与容器常用指令大全
    Windows to Go U盘系统制作(未测完成)
    电阻的基础与应用
    基于Matlab实现logistic方法(源码+数据)
    管理会计学复习题集 答案
    JAVA:实现已递归形式GCD最大公约数算法(附完整源码)
  • 原文地址:https://blog.csdn.net/AAlykk/article/details/134424386