模板程序设计的基本概念:
编写不依赖于具体数据类型的程序
将算法从特定的数据结构中抽象出来,成为通用的
C++的模板为模板程序设计奠定了关键的基础
函数模板:
由于重载函数的功能相同,仅参数类型不同。若能对重载函数的参数类型做抽象表达,即使用统一形式表达,则可以大大简化源程序。
函数模板的定义格式:
Template<class (typename)T1,class T2,………>
返回值类型 函数名(参数裂变){
函数体
}
格式说明:
Template:关键字,用于定义模板。
一对尖括号:界定模板的参数列表。
class (或typename):关键字,用于定义抽象类型T(也可以用其他标识符表示)。
模板参数表可包含多个类型参数,参数间用逗号分隔。T1、T2等表示抽象类型
函数模板:通过数据类型的参数化,把一组重载函数表示成统一的形式,即函数模板是对一组重载函数的抽象。
模板函数:将函数模板中的抽象类型用具体的数据类型(如int,float,double等)替代后产生的函数
函数模板的使用:
例如:
#include<iostream>
Using namespace std;
//定义函数模板
Template<class T>
void swap(T&x,T&y)
{
T t=x ;
x=y ;
y=t ;
}
int main()
{
swap(m,n) ;
cout<<m<< ‘,’<<n<<endl ;
return 0 ;
}
函数模板代表一类函数,必须将其模版参数实例化,才能产生具体函数,供实际调用。这一过程在编译时完成,不会影响程序的运行效率。其过程如下:
1、 先根据函数调用的实参类型int,确定模板实参类型为int ;
2、再将模板实参类型int传给模板形参,产生模板函数:void swap(T&x,T&y)
之后如果再遇到相同类型的调用,则直接使用该函数模板,而不产生新的模板函数。
类模板:
实际编程时常涉及一组类,它们的成员组成相同,成员函数的代码形式相同,所不同的只是某些数据成员的类型。例如:
class IntStack{
int buf[100];
public:
void push(int);
int pop();
………..
};
class DoubleStack{
double buf[100];
public:
void push(double) ;
double pop() ;
............
};
我们可以用类模版将数据类型参数化,将类模版统一描述。
类模版定义的格式:
template<模板参数表> //模板声明
class 类名{ //类的定义
................ //成员
} ;
例:
Template <class T,class I>
class Stack{
T buffer[I];
int top;
public:
Stack(){top=0;}
void Push(T&item);
T Pop();
};
说明:模板参数分为类型参数或非类型参数。类型参数用class或typename说明。
I为非类型参数
T为类型参数
在类模版定义体中,可在指定类型的地方使用类型参数,在使用表达式的地方使用非类型参数。在类内定义类模版成员函数的地方与普通类一样。
在类模板外定义类模板的成员函数:
先进行模板声明
再用类模板名来限定函数名