• C++模版初阶讲解


    今日为大家分享C++的模版,这里先把模版的初阶讲解一下,以后再讲解模版进阶!

    前言:模版的引入

    在我们进行学习的编程中,常常会有许多函数的功能相同,有些不同点可能就是其中的数据类型不同!如果我们统统进行函数重载的话,其实也能解决问题,例如,实现两个数的交换!

    1. void Swap(int& left, int& right)
    2. {
    3. int temp = left;
    4. left = right;
    5. right = temp;
    6. }
    7. void Swap(double& left, double& right)
    8. {
    9. double temp = left;
    10. left = right;
    11. right = temp;
    12. }
    13. void Swap(char& left, char& right)
    14. {
    15. char temp = left;
    16. left = right;
    17. right = temp;
    18. }
    19. .....

    但是函数重载也存在许多问题!

    1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数

    2. 代码的可维护性比较低,一个出错可能所有的重载均出错。


    那么是否有一种更好的方法来解决这种问题呢?答案是肯定的,最好的解决方法就是引用模版!

    一、模版的分类!

    1.函数模版

    1.定义

    函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。


    2.函数模版格式

    template

    返回值类型 函数名(参数列表){}
     

     例如实现一个交换两个数的模版!


    3.函数模版的原理

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

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

    4.函数模版的实例化

    用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
     

    隐式实例化:

    根据我们传入的形参的类型,编译器自动推演出并生成对应类型的函数!

    显式实例化:

    我们在调用模版时,直接对模版的类型进行显式调用!

    例如在上述函数模版中,我们在swap后面加上“<>”,显式的调用整形的模版! 当我们不加的话,编译器会自动根据形参类型来生成最合适的函数!


    5.模版参数的匹配原则

    1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数,对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

    其中对于1,编译器会优先调用现有的Add函数,而不是让编译器去实例化一个模版函数!对于2来言,因为没有相对于的函数,只能使用模版来实例化一个更匹配的函数!所以其会调用模版来实例化一个Add(double,double)类型的函数!其中调用那个函数,可以通过打断点调试来观察!

    通过上面例子可以看出,当存在匹配的函数后,编译器便不会再进行模版的实例化,只有当没有对于的函数存在时,编译器才会进行模版的实例化,生成一个更合适的函数!

    其实也可以这样理解:编译器也会偷懒,只要有合适的函数,他便不自己生成,而使用存在的,只有当没有合适的函数时,他才会进行生成!


    2.类模版

    1.类模版的定义格式

    1. template<class T1, class T2, ..., class Tn>
    2. class 类模板名
    3. {
    4. // 类内成员定义
    5. };

    假设定义一个vector类模版!

    与函数模版类似,只不过下面变成了class+类名而已!其实都大差不差!

    在这里需要注意:1.Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具。
     2.当在类外进行定义函数时,需要加上模版参数列表!


    2.模版的实例化

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

    // Vector类名,Vector才是类型

    Vectorvv1;

    Vectorv2;

    总结:

    函数模版可以大大减少我们的工作量,让我们增加更多的时间去思考,而不是将大量的时间花费在重复的代码中!


    至此,关于模版的初阶讲解以及完毕了,初阶的讲解主要是让大家能简单认识模版的格式以及简单的使用!但是模版的学习并没有结束,以后还会进行模版的进阶进行讲解! 

    希望读完本篇文章,可以让读者对模版有一定的认识!如果有收获,希望大家留下免费的小心心哦!

     

  • 相关阅读:
    HTML/XML转义字符对照
    51 单片机 led 灯光操作
    [BAT-表姐御用02tree命令】提取目录文件夹及其子文件后,tree形列出
    第十三届蓝桥杯大赛软件赛国赛B组C/C++(个人题解)
    CS8630 无效的 nullable 值: C# 7.3 的“Enable”
    抛弃真实数据集?生成式AI“踢馆”人工智能下半场
    【国际化多语言方案】i18n / class google sheets v4 api 在线文档同步json
    群晖NAS使用Docker部署WPS Office结 合内网穿透实现远程编辑本地文档
    Oracle中数据库的查询(三)
    mfoc-hardnested在visual studio2022编译
  • 原文地址:https://blog.csdn.net/weixin_71276184/article/details/133909290