美文网首页
C++基础学习笔记(六):函数模板和类模板

C++基础学习笔记(六):函数模板和类模板

作者: 于同学的学习空间 | 来源:发表于2019-04-02 20:59 被阅读0次

    函数模板

    在C++程序中,经常能看到以 template<class T> 等形式的语句,这其实就是应用了模板的知识,在C++中,凡是出现了类似的语句,我们都可以认为是一种泛型化的编程,所谓泛型编程,就是指不再拘泥于某种特定类型的变量来编写函数或类,而是随着程序的需求,来自动转换成为程序需要的类型,比如编写一个交换两数的函数,不确定要交换的是两个整形数还是两个double型数据,在这种情况下,就可以使用模板,等到程序确定了要交换何种类型的变量时,再根据相应情况转换,如下所示:

    template <class T>
    void Swap(T x, T y)
    {
        T tmp = x;
        x = y;
        y = tmp;
    }
    

    首先,模板原型如下所示:

    template <class 类型参数名>   //class 可用 typename 替换
    

    在上个函数中,T 就成为了这里的类型参数名,在实际应用时,如果 x 和 y 赋为 int 型,那么 T 就被转换成 int 型。
    下面是返回数组最大元素的函数:

    template <class T>
    T FindMaxNum(T a[],int size)
    {
        T MaxNUm = a[0];
        for(int i = 1;i < size; ++i)
            if(MaxNUm < a[i])
                MaxNUm = a[i];
        return MaxNUm;
    }
    

    当然,模板也可以有不同的类型参数,比如:

    template <class T1,class T2>
    

    这样可以有效避免参数类型的二义性
    值得注意的一点是,函数模板是可以重载的,只要形参表不同即可。
    在学习C++的基础课程时,遇到了这么一个知识点,如果程序调用了一个函数,编译器将按照以下顺序去匹配相应的函数原型:

    Step 1:寻找参数完全匹配的普通函数(即不是由模板实例化得到的函数)
    Step 2:寻找参数完全匹配的模板函数
    Step 3:寻找实参经过自动类型转换后能够匹配的普通函数
    Step 4:上面的都无法匹配,则报错

    类模板

    类模板的使用方法与函数模板相差不大,但也有区别,类模板要考虑的东西会更多,首先来看一下类模板的声明:

    template <class 类型参数1, 类型参数2, ......>
    class 类模板名
    {
             成员函数和成员变量
    };
    
    

    如果成员函数在类模板的外面定义时,要写成如下格式:

    template 型参数表
    返回值类型 类模板名<类型参数名列表>::成员函数名(参数表)
    {
        ......
    }
    

    以下是一个实例:

    #include <iostream>
    
    using namespace std;
    
    template<class T>
    class Square
    {
    public:
        T SideLength;
        void input(T a);
        void output(void);
    };
    
    int main()
    {
        Square<int> square;    //写出参数类型
        square.input(5);
        square.output();
        return 0;
    }
    
    template<class T>
    void Square<T>::input(T a)    //成员函数写在外部时,要遵循这个格式
    {
        SideLength = a;
    }
    
    template<class T>
    void Square<T>::output(void)
    {
        T a = SideLength;
        cout << a*a << endl;
    }
    
    

    相关文章

      网友评论

          本文标题:C++基础学习笔记(六):函数模板和类模板

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