目录
实验内容:
1、模板函数(compare)
一般模板函数
特化模板函数
2、模板类Queue或Stack
模板类(Queue,Stack)
成员模板函数
模板特化:模板函数特化、模板成员函数特化、模板类特化
3、模板类AutoPtr
构造函数
析构函数
拷贝构造函数
等号、->、*等运算符重载
主函数调用AutoPtr
一、模板函数(compare):
数据的值可以通过函数参数传递,在函数定义时数据的值是未知的,只有等到函数调用时接收了实参才能确定其值。 在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。
所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板。
1. 一般模板函数:
//当v1<v2时返回-1,v1=v2时返回0,v1>v2时返回1
//一般模板函数,使用template 定义Type变量表示Type可以是任何数据类型,既能比较浮点数的大小又能比较整型数的大小
template<class Type>
int compare(const Type& v1, const Type& v2)
{
if(v1<v2) return -1;
if(v1>v2) return 1 ;
else return 0;
}
所有函数模板的定义都是用关键字 template 开始的,该关键字之后是使用尖括号 <> 括起来的类型参数表。每一个类型参数 T 之前都有关键字 class 或者关键字 typename,这些类型参数代表的是类型,可以是内部类型或自定义类型。这样,类型参数就可以用来指定函数模板本身的参数类型和返回值类型,以及声明函数中的局部变量。函数模板中函数体的定义方式与定义其它函数类似。
2.特化模板函数:
对于该函数模板,当实参为两个char指针时,比较的是指针的大小,而不是指针指向内容的大小,此时就需要为该函数模板定义一个特化版本,即特殊处理的版本,可以对字符串进行特殊处理:
template <>//声明是模板特化函数
int compare<const char *>(const char* const& v1, const char * const& v2) //进行全特化
{
return strcmp(v1,v2); //调用字符串比较函数
}
模板函数只能写在头文件内,而特化函数的实现只能写在CPP内
二、模板类Queue:
1.模板类(Queue):
类模板声明的语法形式:
template<模板参数表>
class类名{
//类成员声明
}
使用类模板,可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型(包括系统预定义的和用户预定义的)。
template<class Type> //Type表示通用数据类型,即可以取任意返回值
class Queue;
template<class Type> //为类取一种模式使得Type变量可以取任意返回值
class QueueItem //对Queue队列数据的管理
{
Type item;
QueueItem * next; //指向队列下一个元素的指针
QueueItem(const Type& val):item(val),next(NULL){} //参数列表构造器方法
friend Queue<Type>; //将队列定义为友元类,方便访问私有变量
friend ostream& operator<<(ostream &os,const Queue<Type> &que);
public:
QueueItem<Type>* operator++()
{
return next; //返回队列下一个元素的指针
}
Type & operator*() //取出存储的元素
{
return item;
}
};
template<class Type>
class Queue //队列
{
public:
Queue();
Queue(const Queue &q);
~Queue();
bool isEmpty(); //判断队列是否为空