1. 程式人生 > >智慧指標(scoped_ptr的實現)

智慧指標(scoped_ptr的實現)

1.實現原理:
它的實現原理是為了防止物件拷貝和賦值,它與auto_ptr的共同之處是scoped_ptr和auto_ptr都是利用一個棧上的物件去管理一個堆上的物件,從而使得堆上的物件隨著棧上物件的銷燬自動刪除。但是,其不可以將指標所有權轉讓,只能在作用域內使用。這也就意味著他不能作為函式的返回值,不能共享所有權
同時它也不能管理陣列物件,它是通過delete來刪除物件的。
2.為什麼要將拷貝建構函式與賦值運算子過載宣告為私有的?
因為scopted_ptr是防拷貝的,但是若是不寫拷貝建構函式和賦值運算子過載,編譯器會自動呼叫系統自身的拷貝建構函式和賦值運算子過載,既然是防拷貝,編譯器都為使用者提供了一個公共介面了,豈不是又功虧一簣,因此,私有宣告時很有必要的。而且在類內只宣告不可定義,原因是若是定義了,在類內可以進行拷貝與賦值。‘

class ScopedPtr
{
public:
        ScopedPtr(T*ptr)
               :_ptr(ptr)
        {}
        ~ScopedPtr()
        {
               if (_ptr)
               {
                       delete _ptr;
                       _ptr = NULL;
               }
        }
        T&operator*()
        {
               return *(this->_ptr);
        }
         T&operator*()const
        {
                return *(this->_ptr);
        }
         T*operator->()
         {
                return this->_ptr;
         }
         T*operator->()const
         {
                return this->_ptr;
         }
private:
        ScopedPtr(const ScopedPtr&s);
        ScopedPtr<T>&operator=(const ScopedPtr&s);
        T* _ptr;
};
int main()
{
        ScopedPtr<int> p1(new int(3));
        system("pause");
        return 0;
}