模板
1.意义:以达到泛型编程的目的。所谓泛型编程,就是程序代码不受类型的限制。
一.函数模板
1.格式:
template <typename T1,typename T2, ……>
返回值类型 函数名 (参数列表) { }
这里的关键字typename也可以用class代替。
2.例:
template <class T>
void Swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
3.函数模板的实例化:用不同类型的参数使用模板。
(1)隐式实例化:让编译器根据实参来推演出参数的类型,进而确定调用那种类型的函数。
int a = 10, b = 20;
cout << "a=" << a << "\nb=" << b << endl;
Swap(a, b);
(2)显式实例化:在函数名后的<>中指出参数的类型。
int a = 10;
double b = 20.0;
Swap(a, b);
//此时调用函数就会出错,因为模板参数只有一个,
//但是传进去的是两个不同类型的参数,编译器无法辨别该调用哪个函数
//解决方法:
//1.强制类型转换
Swap(a,(int)b);
//2.显式实例化
Swap<int>(a,b);
4..函数模板与同名的非模板函数的调用规则:
先调用参数匹配的非模板函数;如果没有,再调用函数模板。
例:
template <class T>
void Swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
void Swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void test(){
int a = 10, b = 20;
cout << "a=" << a << "\nb=" << b << endl;
Swap(a, b);
}
此时,由于有参数类型完全匹配的非模板函数,调用的就是非模板函数。
二.类模板
1.格式:
template <typename T1,……>
class 类名{
类成员
}
2.例:
template <class T>
class compare {
private:
T x, y;
public:
compare(T a, T b) {
x = a;
y = b;
}
T max();
};
注意:在类外定义模板类的成员函数时需要加上template <class T>
例:
template <class T>
T compare<T>::max() {
return x > y ? x : y;
}
3.类模板的实例化:
类名 <类型> 对象名
例:
compare<int> a(1, 2);
cout << a.max() << endl;