1.函数模板
函数模板属于类属,它能处理不同类型的数据。当编译器遇到函数调用时,将根据实际参数的类型产生特定的代码。函数模板的定义形式是:
template <类型参数表>
返回值类型 函数名 (形式参数表) {
//函数体
}
函数重载是函数名相同,当参数一定不完全相同,并且这些函数执行操作类似。采用函数重载,需要对每个函数分别写出相应的代码,如:
int square(int number) {
return number *number;
}
float square(float number) {
return number* number;
}
上面两个函数的唯一区别是参数类型和返回值类型不同,这时候采用函数模板比采用函数重载更方便。
template <class T>
T square(T number) {
return number *number;
}
调用方式:
int y, x = 4;
float v, w = 4.0f;
y = square(x);
v = square(w);
注意:
- (1)函数模板仅仅是对函数外观的声明,其自身并不占内存。当编译器遇到函数调用时,将在内存中创建一个函数实例。
- (2)模板的定义必须出现在函数调用之前,这是因为在遇到对函数模板的调用时,编译器必须知道模板的内容。
2.在函数模板中使用多种类型
template<class T1, class T2>
void swapData(T1 &a1, T2 &a2P {
T1 temp;
temp = a1;
a1 = (T1) a2;
a2 = (T2) temp;
}
3.类模板
定义类模板和定义函数模板类似,在类的定义之前加上template关键字。
template <class T>
class A {
private:
T a;
public:
void a1(int);
};
类模板中函数成员的定义
template <class T>
void A<T>::a1(int) {
...
};
定义类模板的对象
A<int> a;
|