美文网首页
函数模板和类模板--GeekBand

函数模板和类模板--GeekBand

作者: 数据小冰 | 来源:发表于2016-06-20 08:50 被阅读30次

    一 函数模板
    函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会用实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
    定义模板函数的语法为:template <typename 数据类型参数 , typename 数据类型参数 , ...> 返回值类型 函数名(形参列表){
    //TODO: //在函数体中可以使用数据类型参数
    }

    其中,template 是定义模板函数的关键字,template后面的尖括号不能省略;typename 是声明数据类型参数名的关键字,多个数据类型参数以逗号分隔。例如,求两个数的值
    //在返回值类型、形参列表、函数体中都可以使用T
    template<typename T> T sum(T a, T b){
    T temp = a + b;
    return temp;
    }

    template<typename T>为模板头,T为类型参数。模板函数的调用形式和普通函数一样:
    int n = sum(10, 20);
    float m = sum(12.6, 23.9);

    二 类模板
    编译器可以根据调用时传递的参数来自动推演数据类型。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:
    class Compare_int{
    public:
    Compare(int a,int b){
    x=a;
    y=b;
    }
    int max(){
    return (x>y)?x:y;
    }
    int min(){
    return (x<y)?x:y;
    }
    private:
    int x,y;
    }

    显然这基本上是重复性的工作,应该有办法减少重复的工作。C++增加了template功能,提供了解决这类问题。可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数,如对以上两个类可以综合写出以下的类模板:
    template <class numtype>
    class Compare{
    public:
    Compare(numtype a, numtype b){
    x=a;
    y=b;
    }
    numtype max(){
    return (x>y)?x:y;
    }
    numtype min(){
    return (x<y)?x:y;
    }
    private:
    numtype x,y;
    }

    可以看到,声明类模板时要增加一行template <class 类型参数名>在上面的例子中numtype就是一个类型参数名。这个名宇是可以任意取的,只要是合法的标识符即可。这里取numtype只是表示“数据类型”的意思而已。此时,mimtype并不是一个已存在的实际类型名,它只是一个虚拟类型参数名。在以后将被一个实际的类型名取代。原有的类型名int换成虚拟类型参数名numtype。在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype,如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。

    相关文章

      网友评论

          本文标题:函数模板和类模板--GeekBand

          本文链接:https://www.haomeiwen.com/subject/frdwdttx.html