c++ 智能指针

来自唐老师的课程 ,由于不提供源码 所以 都是自己手敲的 不对的地方 多担待,在这也只是做个记录!

智能指针头文件:

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

这里我把 拷贝构造函数 去掉 一样可以 出来 正确的结果。要想想 这里拷贝构造函数的使用是为什么呢?

这里还要多关注一下 拷贝函数的使用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值