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

 

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

#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;
}

运行结果:

 

posted @ 2022-07-29 14:18  王牌飞行员_里海  阅读(21)  评论(0编辑  收藏  举报