//自动指针即auto_ptr,不同于scoped_ptr指针的是自动指针会转移使用权
//在进行赋值或者拷贝构造之后,原来的auto_ptr会失去对所管指针的拥有权,并且将自己的指针赋为NULL
//同时,在赋值和拷贝构造之后,原来的auto_ptr的指针会指向NULL,也是它最大的弊端之一
//因为这和我们通常所理解的copy非常不同,所以<span style="color: rgb(34, 34, 34); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">Google C++ Style提到 scoped_ptr已经足够好了,必要时可以使用share_ptr但永远不要使用auto_ptr</span>
//而且std::auto_ptr在c++11中已经被声明为弃用
//重点是赋值操作符的写法,考虑多种不同的情况
#include <iostream>
using namespace std;
template <class _Ty>
class auto_ptr
{
private :
mutable bool _Owns;
mutable _Ty *_Ptr;
public :
auto_ptr(_Ty *_P = 0) : _Owns(_P != 0), _Ptr(_P){}
auto_ptr(const auto_ptr<_Ty>& _Y);
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y);
~auto_ptr();
_Ty operator*() const;
_Ty * operator->() const;
_Ty * get() const;
_Ty * release() const;
};
template <class _Ty>
_Ty* auto_ptr<_Ty> :: get() const
{return _Ptr;}
template <class _Ty>
_Ty auto_ptr<_Ty> :: operator*() const
{return *get();}
template <class _Ty>
_Ty* auto_ptr<_Ty> :: operator->() const
{return get();}
template <class _Ty>
auto_ptr<_Ty> :: ~auto_ptr()
{
if(_Owns)
delete _Ptr;
}
template <class _Ty>
_Ty* auto_ptr<_Ty> :: release() const
{
_Owns = 0;
_Ty * temp = _Ptr;
_Ptr = NULL;
return temp;
}
template <class _Ty>
auto_ptr<_Ty> :: auto_ptr(const auto_ptr<_Ty>& _Y)
{
_Ptr = _Y._Ptr;
_Owns = 1;
_Y.release();
}
//重点
template <class _Ty>
auto_ptr<_Ty>& auto_ptr<_Ty> :: operator=(const auto_ptr<_Ty>& _Y)
{
if(this != &_Y)
{
if(_Ptr != _Y.get())
{
if(_Owns)
delete _Ptr;
_Owns = _Y._Owns;
}
else if(_Y._Owns)
_Owns = true;
_Ptr = _Y.release();
}
return (*this);
}
int main()
{
int *p = new int(19);
auto_ptr<int> ap(p);
auto_ptr<int> ap2;
cout << *ap << endl;
ap2 = ap;
if(ap2.get() == NULL)
cout << "ap2 == NULL" << endl;
else
cout << *ap2 << endl;
return 0;
}