模板(template)是C++最为强大的 功能之一,它使得算法的实现无关于数据的类型,使模板能适用于任意一组相关的函数和类。模板的意义是实现数据类型的参数化,提高了代码的重用率。
eg:计算两个数的最大值。
#include<iostream>
using namespace std;
int myMax(int a,int b){
return a>b?a:b;
}
char myMax(char a,char b){
return a>b?a:b;
}
double myMax(double a,double b){
return a>b?a:b;
}
int main(){
cout<<myMax(5,6)<<endl;
cout<<myMax('X','h')<<endl;
cout<<myMax(5.5,6.7)<<endl;
return 0;
}
输出结果:
你会发现上面像老太太的缠脚布,真是又臭又长。下面我用模板去简化下上面的代码。
#include<iostream>
using namespace std;
template<typename T>
T myMax(T a,T b){
return a>b?a:b;
}
int main(){
cout<<myMax(5,6)<<endl;
cout<<myMax('X','h')<<endl;
cout<<myMax(5.5,6.7)<<endl;
return 0;
}
输出结果:
综上你会发现使用模板两个优点:
1.减少重复代码
2.处理目前未知数据
实现模板的重要手段就是“数据类型参数化”。分为两个层次:数据的参数化;类型的参数化。所谓参数化就是将具体的数据或数据类型的形式化表示。
其中template是模板的标识,尖括号部分<class T>是对数据类型形式参数T的说明,关键字class表明它是一个模板形式参数。
模板分为类模板和函数模板,对于函数模板的定义的语法规则如下:
(1)所有模板都必须以关键字template开始,关键字template告诉编译器下面的程序代码将会操作多种数据类型。
(2)以尖括号<>括起来的部分为模板形参列表,在该类表中声明了一个或多个模板形参,若多个模板形参,它们之间用逗号隔开,并且所有的形参前面必须加关键字class或者typename。
eg:
template<typename T,typename Q>
void do_anything(T t,Q q);
(3)除了模板语法外,普通函数和模板函数的唯一区别就是有表示类型参数的T表示函数形参的类型。
对于类和结构体也可以带模板。
eg:
template<typename T>
class Poin{
T x,y;
point(T x=0,T y=0):x(x),y(y){}//表示把成员变量x,y初始化为参数x,y
};
结构体和类差异很小,主要区别在默认访问对象和继承方式不同。在工程中一般用struct定义纯数字,包含较少的成员函数;class定义复杂的行为。
本文只是为了解模板函数和模板类,为能更好的理解(标准模板库)STL做铺垫。