函数模板
——用来创建一个通用功能的函数,以支持不同形参,进一步简化重载函数的函数体设计。
template<calss 类型名1,class 类型名2,...>
返回类型 函数名(形参表)
{
函数体;
}
- class是关键字,也可以是typename。
template <class T>
T add(T x,T y)
{
return x+y;
}
template <class T,int size>
T sum()
{
...
}
- 显式实例化:
函数名 <具体类型名1,具体类型名2,... ,常量表达式>(实参表)
如: add<double>(8,9) sum<int, 100>
- 隐式实例化:如add('A','B')
- 隐式实例化无法初始化模板参数表中的普通类型的参数,如果模板参数表中使用普通类型参数,必须使用显式的初始化。
- 当同时存在函数重载和函数模板时,先进行函数重载的精确匹配,若不能精确匹配重载函数,则再实例化函数模板。
- C++重载函数匹配的优先顺序:精确匹配——>实参类型向高类型转换后的匹配——>实参类型向低类型及相容类型转换后的匹配。
类模板
template <模板参数表>
class 类名
{
成员名;
}
- 类模板中的成员函数可以是函数模板也可以是普通函数。
- 类模板的成员函数可在类外定义,格式为:
template <模板参数表>
类型 类名 <模板参数名表>::函数名(参数表)
{
函数体;
}
如:
template <class TNO, class TScore, int num>
class Student
{
private:
int n;
TNO StudentID[num];
TScore score[num];
public:
void append(TNO ID, TScore s);
void Delete(TNO ID);
int search(TNO ID);
void sort();
void DispAll();
Student();
};
Template <class TNO, class TScore, int num>
int Student<TNO,TScore,num>::search(TNO no)
{
for(int i = 0; i < n; i++)
{
if(StudentID[i] == no)
return i+1;
}
return 0;
}
- 默认模板参数:
template <class TNO, class TScore = int, int num = 10>
class Student
{
...
};