函数模板
在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;
}
网友评论