来自唐老师的课程 ,由于不提供源码 所以 都是自己手敲的 不对的地方 多担待,在这也只是做个记录!
智能指针头文件:
#ifndef SMARTPOINTER #define SMARTPOINTER namespace DTLib { template <typename T> class SmartPointer{ protected: T* m_pointer; public: //构造函数 SmartPointer(T* p=NULL){ m_pointer = p; } //拷贝构造函数 SmartPointer(const SmartPointer<T>& obj){ m_pointer = obj.m_pointer; //想想为什么一定要 类型转换呢 const_cast<SmartPointer<T>&>(obj).m_pointer = NULL; } T* operator-> (){ return m_pointer; } T* operator* (){ return *m_pointer; } //=这个重载是为了做什么呢 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; } bool isNull(){ return (m_pointer==NULL); } T* get(){ return *m_pointer; } //堆空间中主动释放堆空间 ~SmartPointer(){ delete m_pointer; } }; } #endif // SMARTPOINTERmain.cpp
#include <iostream> #include"SmartPointer.h" using namespace std; using namespace DTLib; class Test{ public: Test(){ cout<<"Test()"<<endl; } ~Test(){ cout<<"~Test()"<<endl; } }; int main() { //智能指针 只能指向 堆空间的单个对象 或者变量 不能指向堆空间的一个数组 也不能指向 //一个 局部变量 和局部对象 SmartPointer <Test> Te = new Test(); SmartPointer <Test> Tes; Tes=Te; cout<<Tes.isNull()<<endl; cout<<Te.isNull()<<endl; return 0; }这里我把 拷贝构造函数 去掉 一样可以 出来 正确的结果。要想想 这里拷贝构造函数的使用是为什么呢?
这里还要多关注一下 拷贝函数的使用!