上篇博客讲到 auto_ptr 的时候,说到一定不要使用。原因就是它的拷贝构造也好还是赋值运算符重载也好,执行完自己什么都没有了。
今天讲的这个 scoped_ptr 这个更 diǎo ~~~,想复制我的?不存在的?还能让你拷贝了。这是俺的私有财产,谁都别想分!就是这个意思。
#include <iostream>
template <typename T>
class ScopedPtr {
public:
ScopedPtr(T* ptr = nullptr)
:_ptr(ptr) {}
T* operator->() {
return _ptr;
}
T& operator*() {
return *_ptr;
}
~ScopedPtr() {
if (_ptr == nullptr)
return;
delete _ptr;
_ptr = nullptr;
}
private:
ScopedPtr(ScopedPtr& sp); // 不仅不定义,还声明成私有!
ScopedPtr& operator=(ScopedPtr& sp); // 给我把门焊死!窗户也一样
T* _ptr;
};
template <typename T>
class ScopedArray {
public:
ScopedArray(T* ptr)
:_ptr(ptr) {}
~ScopedArray() {
if (_ptr == nullptr)
return;
delete _ptr;
_ptr = nullptr;
}
T& operator[](size_t pos) {
return _ptr[pos];
}
T& operator*() {
return *_ptr;
}
T* operator->() {
return _ptr;
}
private:
ScopedArray(ScopedArray& sa);
ScopedArray& operator=(ScopedArray& sa);
T* _ptr;
};
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!