#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; }
时间: 2024-10-10 10:25:18