【c++】智能指针类模板
  CiIZfyyIq65u 2023年11月30日 23 0


/*************************************************************
** 功能:智能指针
** 作用:
** 指针生命周期结束时主动释放堆空间
** 一片堆空间最多只能由一个指针标识
** 杜绝指针运算和指针比较
**
** 使用规则:智能用来指向堆空间中的单个对象或者变量
**************************************************************/

#pragma once

namespace DTLib //命名空间
{
    template<typename T>
    class SmartPointer //智能指针类模板
    {
    protected:
        T* m_pointer; //定义成员变量
    public:
        //构造函数 指针赋值为NUL
        SmartPointer(T* p = NULL)
        {
            m_pointer = p;
        }
        //拷贝构造函数
        SmartPointer(const SmartPointer<T>& obj)
        {
            m_pointer = obj.m_pointer;
            //obj.m_pointer = NULL; //因为是const所以没发直接赋值
            const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;    //强制类型转换 去除一个对象的const属性
        }
        //重载赋值操作符
        SmartPointer<T>& operator = (const SmartPointer<T>& obj)
        {
            if (this != &obj)//如果不是自己复制自己
            {
                delete m_pointer;
                m_pointer = obj.m_pointer;
                const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
            }
            return *this; //返回自己,可以连续调用
        }

        //重载指针的特征操作符->
        T* operator-> ()
        {
            return m_pointer;//返回成员指针
        }
        T& operator* ()
        {
            return *m_pointer;//返回成员指针指向的内容
        }

        //判断指针是否是空指针
        bool isNull()
        {
            return(m_pointer == NULL);
        }
        //获取成员指针的值
        T* get()
        {
            return m_pointer;
        }

        //析构函数
        ~SmartPointer()
        {
            delete m_pointer;
        }
    };
}



用法:



# include <iostream>
# include "SmartPointer.h"
using namespace std;
using namespace DTLib;

class Test
{
public:
    Test()
    {
        cout << "Test" << endl;
    }
    ~Test()
    {
        cout << "~Test" << endl;
    }
};

void doJob() //运行完后自动释放指针指向的堆空间
{
    //Test* sp = new Test(); //定义指针,将指针指向堆空间的Test对象
    SmartPointer<Test> sp = new Test(); //定义智能指针,将智能指针指向堆空间的Test对象
    SmartPointer<Test> nsp;
    nsp = sp;                            //自动释放sp
    cout << sp.isNull() << endl; //1
    cout << nsp.isNull() << endl;//0

}


int main()
{
    doJob();


    cin.get();
    return 0;
}



运行结果:

【c++】智能指针类模板_c++

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月30日 0

暂无评论

推荐阅读
CiIZfyyIq65u