C++ 模板类与智能指针

本文详细介绍了C++中的模板类和智能指针。内容涵盖模板函数的一般和特化使用,类模板Queue的实现,以及模板类智能指针的构造、析构、拷贝构造函数和运算符重载。通过实例演示,展示了如何利用模板提高代码的复用性和智能指针在内存管理中的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、实验内容

二、实验过程

1.模板函数

1.1一般模板函数

1.2特化模板函数

 2.类模板Queue

2.1类模板

2.2成员模板函数

2.3 模板特化

3.模板类智能指针

3.1智能指针

3.2构造函数

3.3析构函数

 3.4拷贝构造函数

3.5等号、->、*等运算符重载 

3.6完整代码

总结:


一、实验内容

一、模板函数(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值