Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153072
  • 博文数量: 39
  • 博客积分: 1395
  • 博客等级: 中尉
  • 技术积分: 413
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-26 15:07
文章分类

全部博文(39)

文章存档

2012年(5)

2011年(16)

2010年(14)

2009年(4)

我的朋友

分类: C/C++

2011-03-10 16:31:58

c++有两种实现引用计数的经典方法,现介绍第一种
  1. #include <iostream>
  2. using namespace std;
  3.     
  4. class U_Ptr
  5. {
  6. private:
  7.     friend class HasPtr;
  8.     int *ip;
  9.     size_t use;
  10.     U_Ptr(int *p):ip(p), use(1) { }
  11.     ~U_Ptr()
  12.     {
  13.         delete ip;
  14.     }
  15.     
  16. };

  17. class HasPtr
  18. {
  19. public:
  20.     HasPtr(int *p, int v):ptr(new U_Ptr(p)), val(v) { };
  21.     HasPtr(const HasPtr &orig):ptr(orig.ptr), val(orig.val)
  22.     {
  23.         ++ptr->use;
  24.     }
  25.     HasPtr& operator=(const HasPtr& rhs)
  26.     {
  27.         ++rhs.ptr->use;
  28.         if(--ptr->use == 0)    //comment1
  29.             delete ptr;
  30.         ptr = rhs.ptr;
  31.         val = rhs.val;
  32.     }
  33.     ~HasPtr()
  34.     {
  35.         if(--ptr->use == 0)
  36.             delete ptr;
  37.     }

  38.     void set_ptr_val(int v)
  39.     {
  40.         *ptr->ip = v;
  41.     }
  42.     
  43.     int get_ptr_val()
  44.     {
  45.         return *ptr->ip;
  46.     }

  47. private:
  48.     U_Ptr *ptr;
  49.     int val;
  50. };
方法很简单,但是如果c++基础知识了解的不清楚的话,有些地方还是有点疑惑的,比如说comment1,为什么先执行 ++rhs.ptr->use,  然后判断 --ptr->use==0, 我不知道你们是不是明白,但是至少我在刚看到这个地方的时候就搞不懂为什么!好,现在解释原因
1. 在c++中,如果对象在申明的同时马上进行初始化操作,则称之为拷贝运算
例如: HasPtr ptr1(p, val);
HasPtr ptr2(ptr1);
HasPtr ptr3 = ptr1; // 此时调用的是HasPtr(const HasPtr &orig),而非重载的赋值 操作符
2. 如果对象在申明之后再进行赋值操作,则称之为赋值运算
例如: HasPtr ptr1(p, val);
HasPtr ptr2(p2, val2);
ptr2 = ptr1; //这个时候调用的才是重载的赋值操作符,这个时候ptr2是另一个对 象,所以他需要先检查自己对应的对象是否需要删除!






阅读(4398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~