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

2019-04-02  本文已影响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;
}

上一篇下一篇

猜你喜欢

热点阅读