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