C++ 实验3 模板

目录

实验内容:

一、模板函数(compare):

1. 一般模板函数:

2.特化模板函数:

二、模板类Queue:

1.模板类(Queue):

2. 成员模板函数:

3.模板特化:模板函数特化、模板成员函数特化、模板类特化:

3.1.模板函数特化:

3.2.模板类特化:

三、模板类AutoPtr:

1.构造函数:

2.析构函数:

3.拷贝构造函数:

4.等号、->、*等运算符重载:

5.主函数调用AutoPtr:

 总结:


实验内容:

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();                        //判断队列是否为空
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值