• 中文
    • English
  • 注册
  • 查看作者
  • C++:模板的概念以及函数模板与模板函数

    一.  模板的概念

    模板是实现代码重用机制的一种工具,它把类型定义为参数,实现类型参数化,从而实现了代码的重用

    模板分为函数模板和类模板,分别允许用户构造模板函数和模板类

    二.  函数模板与模板函数

    1.  所谓函数模板,实际上是建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板

    2.  在调用函数时系统会根据实参的类型(模板实参)来取代模板中虚拟类型从而实现了不同函数的功能。

    3.  函数模板经实例化而生成的具体函数称为模板函数。

    4.  函数模板代表了一类函数,

    5.  模板函数表示某一具体的函数。

    6. 函数模板声明如下:

    template < typename 类型参数>
    返回类型  函数名(模板形参表)
    {
        函数体
    }
    /*template是声明模板的关键字,类型参数是一个虚拟的类型名,常用T,Tybe表示,使用函数模板时无论是typename还是class后面的类型参数,都必须实例化,用实际的数据类型(既可以使系统预定义的标准数据类型,也可以是用户自定义的类型)替代它*/

    也可以定义成:

    template <class  类型参数>
    返回类型  函数名(模板形参表)
    {
        函数体
    }

    7.  将函数模板中的类型参数实例化的参数称为模板实参。

    8.  在函数模板中允许使用多个类型参数。但是应当注意template定义部分的每个类型参数前必须有关键字typename (或class )。

    9.  建立了有两个类型参数的函数模板。

    #include<iostream>
    using namespace std;
    template < typename type1, typename type2>
    void myfunc( type1 x, type2  y)
    {
        cout<<x<<’ ’<<y<<endl;
    }
    int main()
    {
        myfunc(10, "hao");
        myfunc(0.123, 10L);
        return 0;
    }

    10.  在template语句与函数模板定义语句之间不允许有别的语句,例如下面的程序段就不能编译。

    template <typename T>
    int i;             //错误
    T max( T x,T y )
    {
        return ( x>y)?x∶y;
    }

    11.  模板函数类似于普通重载函数,但更严格一些。

    12.  普通的非模板函数被重载的时候,在每个函数体内可以执行不同的动作。

    13.  但同一函数模板实例化后的所有模板函数都必须执行相同的动作。

    14.  函数模版也可以重载

    15.  函数模板与同名的非模板函数可以重载。在这种情况下,调用的顺序是:

    首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它;

    若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。

     

  • 0
  • 0
  • 0
  • 4.8k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: