智慧指標(scoped_ptr的實現)
阿新 • • 發佈:2019-01-05
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; }