模板
功能上类比C++的重载函数,可以使用一种通用的形式,去代替诸多数据类型,使得使用同一种函数的时候,可以实现对于不同数据类型的相同操作。增强类和函数的可重用性。
使用模板函数为函数或类声明一个一般的模式,使得函数的参数、返回值或类中的某些成员取得任意类型。
函数模板
函数模板可以用来创建一个通用功能的函数,支持不同形参,以简化重载函数函数体的设计。
声明方法
template <typename 标识符>
函数声明
实例(求绝对值函数的模板)
#include<iostream>
using namespace std;
template<typename T>
T abs(T x)
{
return x<0?-x:x;
#问号表达式,假如问号前面的式子成立,则返回冒号前面的数值,反之返回冒号后面的数值
}
int main()
{
int n=4;
double d=12.2;
cout<<abs(n)<<endl<<abs(d);
return 0;
}
补充知识点——问号表达式
return x<0?-x:x;
问号表达式,假如问号前面的式子成立,则返回冒号前面的数值(或表达式),反之返回冒号后面的数值(或表达式)
类模板
类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型。
声明方法
template <模板参数表>
class 类名
{类成员声明}
注意,在类模板外定义成员函数时,需要在函数定义前加上模板名。
template<模板参数表>
类型名 类名<T>::函数名 (参数表)
使用模板类产生对象时,按照以下形式声明:
模板类名<模板参数表>对象名1,对象名2...;
实例
#include<iostream>
using namespace std;
template<typename T>
class compare
{
public:
compare(T x,T y)
{
item1=x;
item2=y;
}
T max(){return item1>item2?item1:item2;}
private:
T item1,item2;
};
int main()
{
compare<int>intp(3,5);
compare<double>dblp(9.5,5.2);
cout<<intp.max()<<endl<<dblp.max();
return 0;
}
小结
此处使用T作为标识符
函数模板声明
template<typename T>
函数体
类模板声明
template<class T>
class 类名
{类的具体内容};
类模板外定义成员函数
template<模板参数表>
类型名 类名<T>::函数名(参数表)
使用模板类产生对象
模板类名<模板参数表>对象名1,对象名2,对象名3...