目录
一、实验内容
一、模板函数(compare)
1.一般模板函数
2.特化模板函数
二、类模板Queue
1.类模板(Queue)
2.成员模板函数
3.模板特化:模板函数特化、模板成员函数特化、模板类特化
三、模板类AutoPtr
1.构造函数
2.析构函数
3.拷贝构造函数
4.等号、->、*等运算符重载
5.6主函数调用AutoPtr
二、实验过程
1.模板函数
函数模板是通用的函数描述,它们使用泛型来定义函数,其中的泛型可用具体的类型替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。由于模板允许以泛型(而不是具体类型)的方式编写程序,因此有时候也被称为通用编程。
1.1一般模板函数
一个简单的数字比较的代码:
template <class Type> //使用template 定义Type变量表示Type可以是任何数据类型
int compare(const Type& v1, const Type& v2){
if(v1<v2) return -1;
if(v1>v2) return 1;
return 0;
}
这段代码可以让传入的参数是任意的数据类型,不需要考虑传入的是整形或者字符型等等而单独实现一个函数了。
测试代码:
int main()
{
cout<<compare(10,20)<<endl;
cout<<compare(3.14,2.56)<<endl;
}
运行结果:
1.2特化模板函数
模板特化:就是在实例化模板时,对特定类型的实参进行特殊处理,即实例化一个特殊的实例版本,
当以特化定义时的形参使用模板时,将调用特化版本。在我们要比较字符串时,我们就需要特化模板函数。
template <>//声明是模板特化函数
int compare<const char *>(const char* const& v1, const char * const& v2) //进行特化
{
return strcmp(v1,v2); //调用字符串比较函数
}//模板函数只能写在头文件内,而特化函数的实现只能写在CPP内
测试代码:
int main()
{
cout<<compare("azurlane","arknight")<<endl;
}
运行结果:
2.类模板Queue
2.1类模板
我们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;我们也需要编写多个形式和功能都相似的类,于是c++引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动。
使用模板类可以使用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、返回值或局部变量能取不同类型(包括系统预定义和用户自定义的)。
C++ 中类模板的写法如下:
template <类型参数表>
class 类模板名{
成员函数和成员变量
};
定义一个类模板Queue和管理类QueueItem
template<class Type> //Type表示通用数据类型,即可以取任意返回值
class Queue;
template<class Type> //类模板的定义,类模板的使用实际上是将类模板实例化成一个具体的类
class QueueItem
{
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(); //判断队列是否为空
void push(const Type& val); //在队列里面增加元素
void pop(); //在队列里面删除元素
void destroy(); //清空队列
Type& front(); //输出队列中的第一个元素
void copy_item(const Queue &orig); //拷贝全部队列
template<class It> //成员模板函数
Queue(It beg,It end); //新的有参构造函数
template<class It>
void assign(It beg,It end); //向队列中添加指定数据
template<c