智能指针(scoped_ptr的实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaodu655/article/details/85780418

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

猜你喜欢

转载自blog.csdn.net/xiaodu655/article/details/85780418
今日推荐