【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; }
运行结果: