一、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;
};