文章目录
一、实验内容
1.模板函数(compare)
一般模板函数、特化模板函数
2.模板类Queue
模板类(Queue)、成员模板函数
模板特化:模板函数特化、模板成员函数特化、模板类特化
3.模板类AutoPtr
构造函数、析构函数、拷贝构造函数、等号、->、*等运算符重载
主函数调用AutoPtr
二、实验过程和相关代码
1、模板函数(compare)
1.1、一般模板函数
模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
下面举例一个一般模板函数,比较大小。T可以是int型,double型等等。
template <class T>
int compare(const T &left, const T &right)
{
cout <<"in template<class T>..." <<endl;
return (left - right);
}
1.2、特化模板函数
但是上述泛化,明显不能用于char类型,char的比较大小不能直接用相减的方式,于是特化:
template < >
int compare(const char* left, const char* right)
{
std::cout <<"in special template< >..." <<std::endl;
return strcmp(left, right);
}
1.3、模板函数实验
#include <iostream>
#include <cstring>
using namespace std;
//函数模板
template<class T>
bool IsEqual(T t1,T t2){
return t1==t2;
}
template<> //函数模板特化
bool IsEqual(char *t1,char *t2){
return strcmp(t1,t2)==0;
}
int main(int argc, char* argv[])
{
char str1[]="ab";
char str2[]="abc";
char str3[]="ab";
cout<<"函数模板:"<<endl;
cout<<IsEqual(1,1)<<endl;
cout<<"函数模板特化:"<<endl;
cout<<IsEqual(str1,str2)<<endl;
cout<<IsEqual(str1,str3)<<endl;
return 0;
}
实验结果截图:
int型的1和1返回结果当然是1,而特化后的可以看出两串字符串比较后字母完全相同返回1,有不相同的则返回0。
2、模板类Queue
2.1、模板类 Queue
类模板格式:
声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。比如
template<class T> class Queue
{
public:
T a;
T b;
T temp(T c, T &d);
};
在类Queue中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数temp。
在类模板外部定义成员函数的方法为:
比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:
template<class T1,class T2> void A<T1,T2>::h(){
}
代码:
template<class Type> class Queue{
public:
Queue():head(0),tail(0)
{
}
Queue(const Queue& q):head(0),tail(0)
{
copy_items(q);//拷贝函数
}
template<class It>
Queue(It beg, It end):head(0),tail(0)
{
copy_items(beg,end);
}
template<class It>
void assign(It beg, It end