来自唐老师的课程 ,由于不提供源码 所以 都是自己手敲的 不对的地方 多担待,在这也只是做个记录!
智能指针头文件:
#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 // SMARTPOINTER
main.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;
}
这里我把 拷贝构造函数 去掉 一样可以 出来 正确的结果。要想想 这里拷贝构造函数的使用是为什么呢?
这里还要多关注一下 拷贝函数的使用!