一、函数模板
1、几个功能相同的函数,比如都是两个数相加,只是参数类型不同(float+float; int+int等)就可以用一个模板函数,简化代码;
2、模板定义:
语法:
template <typename 虚拟类型名称> 函数返回值 函数名称 (参数列表){函数体}
或者
template <class 虚拟类型名称> 函数返回值 函数名称 (参数列表){函数体}
例如:
//函数模板 template <typename I> //typename I 和 class I 一样的作用 I add(I a, I b) { return a+b; }
template <typename I> template <typename[class] 虚拟类型名称>
I add(I a, I b) //函数返回类型 函数名 (参数1,......)
{
return a+b;
} //函数体
3、函数模板的使用
cout<<add(5,5)<<endl<<add(5.2,5.2)<<endl;//
//cout<<add(5,5.2)<<endl;//5和5.2 不明确类型语法有错误
/*
F:\mystudy\classtemplate\classtemplate\classtemplate\classtemplate.cpp(32) : error C2782: “I add(I,I)”: 模板 参数“I”不明确
f:\mystudy\classtemplate\classtemplate\classtemplate\classtemplate.cpp(9) : 参见“add”的声明
可能是“double”
或 “int”
*/
//cout<<add((int)5.2, 5.2); //同上不明确
cout<<add(5,(int)5.2)<<endl;//这种格式就比较明确
cout<<add((double)5,5.2)<<endl;
二、类模板
1、类模板声明格式
template <class 虚拟类型参数>
class 类名
{
//类体
构造函数
函数返回值 函数名(虚拟类型参数名)
};
即:
template <class T>
class A
{
//类体
public://
A();//构造函数
void test(T a);//函数返回值 函数名(虚拟类型参数名)
};
#ifndef TEMP
#define TEMP
//类模板(Class templates)
/*
1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。
2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如下例中的T)。
3) 在类声明前面加入一行,格式为:
template <class 虚拟类型参数>
如:
template<class T>
class A//A 类型名称
{
public:
T g(T a, T b);
A();
}; //类体
*/
template<class T>
class A//A 类型名称
{
public:
T g(T a, T b);
A();
};
#endif
//template<class T> A<T> 类型名称
template<class T>
A<T>::A()
{
}
template <class T> //类模板格式
T A<T>::g(T a, T b) //T 函数返回值
{
return a+b;
}
2、类模板函数的定义
template<class T> 类型名称::函数名称(参数列表)
{
函数体。。。
}
即:
template<class T> A<T>::A()
{
}
//template<class T> A<T> 类型名称
template<class T>
A<T>::A()
{
}
template <class T> //类模板格式
T A<T>::g(T a, T b)
{
return a+b;
}
3、对象定义格式
类模板名<实际类型名> 对象名;
类模板名<实际类型名> 对象名(实参表列); (构造函数有参数定义格式)
A<int> t; //此处定义了T的类型为整型,所以类型明确没有语法错误
//A b; // 1,error C2955: “A”: 使用类 模板 需要 模板 参数列表 2,error C2133: “b”: 未知的大小 3,error C2512:
// “A”: 没有合适的默认构造函数可用
//b.g(5,5); error C2662: “A<T>::g”: 不能将“this”指针从“A”转换为“A<T> &”
/* 对象定义格式
类模板名<实际类型名> 对象名; A 对应 类模板名 <int> 对应 <实际类型名> t 对应对象名 A<int> t;
类模板名<实际类型名> 对象名(实参表列); 构造函数有参数定义格式
*/
4、类模板成员函数使用
对象.方法(参数);
A<int> t;
t.g(5.6,5.2); // 11
//此处定义了T的类型为整型,所以类型明确没有语法错误;就算你给的参数是float 也会按照int解释
使用和类一模一样;