一、unique_ptr的模拟实现
在之前的博客中,我说过auto_ptr
的缺陷,所以为了避免auto_ptr
的缺陷,所以unique_ptr
用了一个简单粗暴的办法:防拷贝、防赋值。既然auto_ptr
在拷贝和赋值的时候,会出现一些问题,那么在unique_ptr
中就不让他进行拷贝和赋值。
那么如何禁止它拷贝和赋值呢?
我们都知道,如果我们没有定义拷贝构造和赋值运算符重载函数时,编译器会为其生成默认的拷贝构造和赋值运算符重载。所以我们可以用下面两种办法来实现禁止拷贝和赋值。
方法一: 在C++98中
将拷贝构造和赋值运算符重载声明为私有成员并且只声明不定义。但是这又一个缺陷,那就是可以通过友元函数来访问。
方法二: 在C++11中
在函数声明后面加上“=delete”,来显式的禁用掉该函数
template<class T>
class Unique_ptr
{
public:
Unique_ptr(T* _ptr=nullptr)
:ptr(_ptr)
{}
Unique_ptr()
{
if (ptr != nullptr)
delete ptr;
}
T& operator*()
{
return *ptr;
}
T* operator->()
{
return ptr;
}
private:
T * ptr;
//C++98中
Unique_ptr(UniquePtr<T> const &);
Unique_ptr & operator=(UniquePtr<T> const &);
//C++11中
Unique_ptr(Unique_ptr<T> const& up)=delete;
Unique_ptr<T>& operator=(Unique_ptr<T> const& up)=delete;
};