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