一.函数模板
1.函数模板的定义
下图中我们三个函数实现的功能实际是一样的,只是数据的类型不同。我们可以通过函数模板来实现将类型作为参数传递就可以实现这三个函数。
使用关键字:template typename class
注意:typename和class可以混用,他们是一个意思。
eg1:通过class来定义模板函数,下图中我们定义了一个max函数模板,并使用这个函数模板,当我们不指定数据类型T时计算机自行判断。
eg2:通过typename来定义模板函数
eg3:
2.变量作为模板参数
用过template关键字来实现模板函数,这个时候传入的就不是一个类型而是一个变量,只有在我们在使用变量的时候才会把函数实例化,使用的时候直接传入常数就好了。
3.多参数函数模板
有时候我们要传递多个参数,并且每个参数的类型并不相同!
4.函数模板与重载
函数模板已经是重载了,我们可以通过一个函数模板来实现无限个模板函数,可以尽情的改变其数据类型,这就是重载了。同时不同的函数模板所做出来的模板函数也可以实现重载关系!
下图中通过三个不同的函数模板可以实例化出三个不同的模板函数,这三个函数就实现了重载!
注意:在我们定义函数模板的时候并没有出现重载的关系,因为仅仅定义函数模板在内存中是不会出现任何代码的,只有当我们只用模板函数的时候才会出现代码(这一点和类很像)
5.代码实例
#include <iostream>
using namespace std;
/**
* 定义模板函数swapNum
* 实现功能:交换两个数的位置
*/
template <class T>
void aswap(T& a,T& b)
{
T temp = a;
a = b;
b = temp;
}
int main(void)
{
int x = 10;
int y = 20;
// 调用模板函数
aswap<int>(x,y);
cout << "x = " << x << endl;
cout << "y = " << y << endl;
return 0;
}
二.类模板
1.类模板的定义
与函数模板一样的,注意的是图2类外定义中每定义一个函数都要加上我们的关键字,以及模板类的类型!
2.类模板多个参数
特别提醒:由于现代编译器的原因模板代码不能分离编译,必须把所有的文件都写在.h文件中(无法写成.cpp和.h分离)
3.代码实例
#include <iostream>
using namespace std;
/**
* 定义一个矩形类模板Rect
* 成员函数:calcArea()、calePerimeter()
* 数据成员:m_length、m_height
*/
template<typename T>
class Rect
{
public:
Rect(T length, T height);
T calcArea();
T calcPerimeter();
public:
T m_length;
T m_height;
};
/**
* 类属性赋值
*/
template <typename T>
Rect<T>::Rect(T length, T height)
{
m_length = length;
m_height = height;
}
/**
* 面积方法实现
*/
template <typename T>
T Rect<T>::calcPerimeter()
{
return m_length * m_height;
}
/**
* 周长方法实现
*/
template <typename T>
T Rect<T>::calcArea()
{
return (m_length + m_height) * 2;
}
int main(void)
{
Rect<int> rect(3, 6);
cout << rect.calcArea() << endl;
cout << rect.calcPerimeter() << endl;
system("pause");
return 0;
}