template <class T>
class ref_ptr{
private:
T* ptr;
long * ct;
void dispose() {
if(--*ct <= 0) {
delete ct;
delete ptr;
}
}
public:
//从 new 得到指针的构造函数
explicit ref_ptr(T* p)
: ptr(p), ct(new long(1)) { }
explicit ref_ptr(const T& t)
: ptr(new T), ct(new long(1)) {
*ptr = t;
}
//从另一个指针得到数据的构造函数
ref_ptr(const ref_ptr<T>& p) throw()
: ptr(p.ptr), ct(p.ct) { ++*ct; }
//析构函数
~ref_ptr() { dispose(); }
//赋值运算符
ref_ptr<T>& operator=(const ref_ptr<T>& p) throw() {
if(this!=&p)
{
dispose();
ptr = p.ptr;
ct = p.ct;
++*ct;
}
return *this;
}
//赋值,从原生对象
ref_ptr<T>& operator=(const T& t) throw() {
dispose();
ptr = new T;
*ptr = t;
ct = new long;
*ct = 1;
return *this;
}
//复制新对象,建立新拷贝,前缀运算符
const ref_ptr<T>& operator++() throw() {
if(*ct > 1)
{
T* tmp = new T;
long* tct = new long;
*tmp = *ptr;
*tct = 1;
dispose();
ptr = tmp;
ct = tct;
}
return *this;
}
//复制新对象,建立新拷贝,后缀运算符
const ref_ptr<T>& operator++(int) throw() {
return ++(*this);
}
//指针对象运算符,返回对象引用
T& operator*() const throw() {
return *ptr;
}
//返回对象指针
T* operator->() const throw() {
return ptr;
}
//返回对象引用,类型转换
operator T() const throw() {
return *ptr;
}
};