二级C++模板:模板的定义
如果一个程序的功能是处理一个特定的数据类型,那么通过把处理过的数据类型声明为一个参数,可以把它重写为一个模板。C++程序是由类和函数组成的,所以C++的模板也分为类模板和函数模板。
1.函数模板的定义:
•模板的一般定义形式:
模板<类型形参表>返回FunctionName(形参表)类型
{
//函数定义体
}
•注意:⒈<类型表单参数表>可以包含基本数据类型以及类类型。如果是类类型,必须以class为前缀。
这个函数模板定义不是一个真正的函数,编译系统不会为它生成任何执行代码。这个定义只是对函数的描述,意味着它每次都可以单独处理类型表单参数表中指定的数据类型。
3.当编译系统发现有函数调用时:FunctionName(实参数表);根据实参数表中的类型,确认是否与函数模板中对应的形参数表匹配,然后生成一个重载函数。重载函数的定义体与函数模板的定义体相同,形式参数表的类型基于实参数表的实际类型。这个重载的函数叫做模板函数。
•模板函数和模板函数的区别:
函数是模板的定义,定义中使用了通用类型参数。
模板是真正的函数定义,是编译器系统在遇到特定的函数调用时产生的,有程序代码。
示例:# include
模板T Max(T&a,T&b)
T最大值(T a,T b)
{
返回a>b?甲:乙;
}
void main()
{
coutb?甲:乙;
}
这样,参数是什么数据类型,返回值是什么类型,从而避免了同一操作的重载定义。
此外,可以像普通函数一样重载模板函数。
示例2: # include
#包括
模板T max(T a,T b)
{
返回a>b?甲:乙;
}
char *max(char *a,char *b)
{
return (strcmp(a,b)?甲:乙);
}
void main()
{
cout类类名
{
//类声明体
}
模板<类型形参表>返回类型类名<类型名表>::MemberFunctionname1(形参表)
{
//成员函数定义体
}
模板<类型形参表>返回类型类名<类型名表>::MemberFunctionname2(形参表)
{
//成员函数定义体
}
模板<类型形参表>返回类型类名<类型名表>::MemberFunctionnamen(形参表)
{
//成员函数定义体
}
•注意:⒈类型和形式参数表与函数模板含义相同。在下面的成员函数定义中,classname <类型名表>中的类型名表是使用类型形参的。
这个类模板的定义其实只是对类的描述,并不是具体的类。
3.建立类模板后,可以通过创建类模板的实例来使用它。
Classname <类型实参数表>对象;
•模板和模板类的区别:
类是模板的定义,而不是真正的类,定义中使用了通用类型参数。
类是真正的类定义和类模板的实例化。类定义中的参数被实际类型替换。
例3:定义一个单向链表的模板类,分别实现添加、删除、查找、打印操作。
#包括
模板类列表
{
公共:
list();
void Add(T &);
无效删除(T &);
T * Find(T &);
void print list();
~ List();
私人:
结构节点{
Node * pNext
T * pT
};
Node * pFirst
}
模板列表::List()
{
p first = 0;
}
模板无效列表::添加(T&t)
{
node * temp =新节点;
temp-> pT = & t;
temp-> p next = p first;
pFirst = temp
}
0条评论