- 函数模板就是建立一个通用的函数,其参数类型和返回类型不具体指定,用一个虚拟的类型来代表。
格式:
template<typename 类型参数>
返回类型 函数名(模板形参表)
{
函数体
}
template是一个声明模板的关键字,类型参数一般用T这样的标识符来代表一个虚拟的类型,当使用函数模板时,会将类型参数具体化。
template <typename T>//加法函数模板
T Add(T x, T y)
{
return x+y;
}
void main()
{
int x=10,y=10;
std::cout<<Add(x,y)<<std::endl;//相当于调用函数int Add(int,int)
double x1=10.10,y1=10.10;
std::cout<<Add(x1,y1)<<std::endl;//相当于调用函数double Add(double,double)
}
typename关键字可用class代替
- 和函数模板一样,类模板就是建立一个通用类,其数据成员的类型、成员函数的返回类型和参数类型都不具体指定,用一个虚拟类型来代表。当使用类模板建立对象时,系统会根据实参的类型来取代类模板中的虚拟类型从而实现不同类的功能。
格式:
template <typename 类型参数>
class 类名
{
类成员声明
}
在类模板中成员函数既可以定义在类模板内,也可以定义在类模板外,在定义类模板外时C++有这样的规定:需要在成员函数定义之前进行模板声明,且在成员函数名之前加上“类名<类型参数>::”:
template <typename(class) 类型参数>
返回类型 类名<类型参数>::函数名(形参)
{
函数体
}
而类模板定义对象的形式:
类模板名<实际类型> 对象名;
类模板名<实际类型> 对象名(实参);
例子:
template <typename T>//在类模板定义之前,都需要加上模板声明
class BinaryOperation//二目运算类
{
private:
T x;
T y;
public:
void sub();
void add()
{
std::cout<<x<<"+"<<y<<"="<<x+y<<std::endl;
}
public:
BinaryOperation(T x1,T x2)
{
x = x1;
y = x2;
}
};
//在类外定义成员函数:
//在成员函数定义之前进行模板声明,必须的 即使上面有此处也必不可少
//且在成员函数名之前加上"类名<类型参数>::"
template <typename T>
void BinaryOperation <T>::sub()
{
std::cout<<x<<"-"<<y<<"="<<x-y<<std::endl;
}