标签:
#include <iostream>
#include<string>
#include<set>
using namespace std;
//智能指针的使用
//智能指针类
class U_ptr
{
friend class hashptr;
int *ip;//在hashptr中实际的需要定义的指针成员
size_t use;//使用次数的计数
U_ptr(int *p):ip(p),use(1){}//合成构造函数
~U_ptr(){delete ip;}//析构函数
};
/*
接受一个指针和一个 int 值的 HasPtr 构造函数使用其指针形参创建一个
新的 U_Ptr 对象。HasPtr 构造函数执行完毕后,HasPtr 对象指向一个新分配
的 U_Ptr 对象,该 U_Ptr 对象存储给定指针。新 U_Ptr 中的使用计数为 1,
表示只有一个 HasPtr 对象指向它。
复制构造函数从形参复制成员并增加使用计数的值。复制构造函数执行完毕
后,新创建对象与原有对象指向同一 U_Ptr 对象,该 U_Ptr 对象的使用计数加
1。
*/
class hashptr
{
private:
U_ptr *p;
int vi;
public:
hashptr(int *pi,int i):p(new U_ptr(pi)),vi(i){}
hashptr(const hashptr& org):p(org.p),vi(org.vi){++p->use;}
hashptr& operator=(const hashptr&);
~hashptr(){if(--p->use==0)delete p;}
int* get_ptr()const{return p->ip;}
int get_int()const{return vi;}
void set_ptr(int *newp){p->ip=newp;}
void set_int(int newint){vi=newint;}
int get_ptr_vi(){return *p->ip;}
int set_ptr_vi(int i){*p->ip=i;}
};
//赋值操作
/*
在这里,首先将右操作数中的使用计数加 1,然后将左操作数对象的使用计
数减 1 并检查这个使用计数。像析构函数中那样,如果这是指向 U_Ptr 对象的
最后一个对象,就删除该对象,这会依次撤销 int 基础对象。将左操作数中的
当前值减 1(可能撤销该对象)之后,再将指针从 rhs 复制到这个对象。赋值
照常返回对这个对象的引用。
这个赋值操作符在减少左操作数的使用计数之前使 rhs 的使
用计数加 1,从而防止自身赋值。
*/
hashptr& hashptr::operator=(const hashptr& org)
{
++org.p->use;
if(--p->use==0)
delete p;
++p->use;
p=org.p;
vi=org.vi;
return *this;
}
int main()
{
//cout<<a[1]<<endl;
system("pause");
return 1;
}
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4396042.html