More Effective中auto_ptr实现

来源:互联网 发布:想给淘宝店铺取个名字 编辑:程序博客网 时间:2024/05/16 06:17
template<typename T>class auto_ptr{    public :        //使用explicit关键字避免隐式转换        explicit auto_ptr(T* p=0);        ~auto_ptr();        //使用另一个类型兼容的auto_ptr来初始化一个新的auto_ptr        template<typename U>        auto_ptr(auto_ptr<U>& rhs);        template<typename U>        auto_ptr<T>& operator=(auto_ptr<U>& rhs);        T& operator*() const;        T* operator->() const;        //返回原始对象的指针        T* get() const;        //放弃指针的所以权        T* release();        //删除原有指针并获得指针的p的所有权        void reset(T* p=0);    private:        T* pointee;
template<class T>
friend class auto_ptr<U>};template<typename T>auto_ptr<T>::auto_ptr(T* p)    :pointee(p){}template<typename T>    template<typename U>auto_ptr<T>::auto_ptr(auto_ptr<U>& rhs)    :pointee(rhs.release()){}template<typename T>auto_ptr<T>::~auto_ptr(){    delete pointee;}template<typename T>    template<typename U>auto_ptr<T>& auto_ptr<T>::operator=(auto_ptr<U>& rhs){    if(this!=&rhs)        reset(rhs.release());    return *this;}template<typename T>T& auto_ptr<T>::operator*() const{    return *pointee;}template<typename T>T* auto_ptr<T>::operator->() const{    return pointee;}template<typename T>T* auto_ptr<T>::get() const{    return pointee;}template<typename T>T* auto_ptr<T>::release(){    T* oldpointee=pointee;    pointee=0;    return oldpointee;}template<typename T>void auto_ptr<T>::reset(T* p){    if(pointee!=p)    {        delete pointee;        pointee=p;    }}

0 0
原创粉丝点击