C++智能指针

1、将指针封装成一个智能指针类,当其他类需要使用指针时,可用智能指针类代替,将智能指针类对象作为类成员;

2、智能指针类作为辅助类,包含了引用计数,当主类的对象进行复制、赋值时,智能指针类中引用计数会相应增加或减少,若计数为0时,

则对对象进行析构;计数不为0时,则不对智能指针类对象进行析构(智能指针类需要动态创建),这样,可以防止出现悬垂指针。

下面的代码有助于加强对智能指针的理解。

1 #include <iostream>
  2 
  3 
  4 //定义仅由HasPtr类使用的U_Ptr类,用于封转使用计数和相关指针
  5 class U_Ptr
  6 {
  7     friend class HasPtr;
  8     int *ip;          //相关指针
  9     size_t use;       //使用计数
 10 
 11     U_Ptr(int *p):ip(p),use(1)
 12     {
 13     }
 14     ~U_Ptr()
 15     {
 16         delete ip;
 17     }
 18 };
 19 
 20 //定义HasPtr类
 21 class HasPtr
 22 {
 23 public:
 24     //构造函数:p是指向已经动态创建的int对象指针
 25     HasPtr(int *p, int i):ptr(new U_Ptr(p)),val(i)
 26     {}
 27 
 28     //复制构造函数:复制成员并将使用计数加1
 29     HasPtr(const HasPtr &orig)
 30         :ptr(orig.ptr),val(orig.val)
 31     {
 32         ++ptr->use;
 33     }
 34     //赋值操作符
 35     HasPtr & operator = (const HasPtr &);
 36 
 37     //析构函数:如果使用计数为0,则删除U_Ptr对象
 38     ~HasPtr()
 39     {
 40         if(--ptr->use == 0)
 41             delete ptr;
 42     }
 43 
 44     //获取数据成员
 45     int *get_ptr() const
 46     {
 47         return ptr->ip;
 48     }
 49     int get_int() const
 50     {
 51         return val;
 52     }
 53 
 54     //修改数据成员
 55     void set_ptr(int *p)
 56     {
 57         ptr->ip = p;
 58     }
 59     void set_int(int i)
 60     {
 61         val = i;
 62     }
 63 
 64     //返回或修改基础int对象
 65     int get_ptr_val() const
 66     {
 67         return *ptr->ip;
 68     }
 69     void set_ptr_val(int i)
 70     {
 71         *ptr->ip = i;
 72     }
 73 
 74 private:
 75     U_Ptr *ptr;
 76     int val;
 77 };
 78 
 79 HasPtr & HasPtr::operator=(const HasPtr &rhs)
 80 {
 81     //增加右操作数中的使用计数
 82     ++rhs.ptr->use;
 83 
 84     //将左操作数对象的使用计数减1,
 85     //若该对象的使用计数减至0,则删除该对象
 86     if(--this->ptr->use == 0)
 87         delete ptr;
 88 
 89     ptr = rhs.ptr;         //复制U_Ptr指针
 90     val = rhs.val;         //复制int成员
 91     return *this;
 92 }
 93 
 94 int main(int argc, char **argv)
 95 {
 96     int *p = new int(42);
 97     HasPtr *obj = new HasPtr(p,10);
 98 
 99     //HasPtr obj(p, 10);
100     HasPtr copy(*obj);
101 
102     delete obj;
103 
104     std::cout<<copy.get_ptr()<<std::endl;
105     std::cout<<copy.get_ptr_val()<<std::endl;
106 
107     system("pause");
108     return 0;
109 }

参考:《C++ Primer》
原文链接: https://www.cnblogs.com/liu-jun/archive/2013/03/01/2939396.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/79178

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午6:55
下一篇 2023年2月9日 下午6:55

相关推荐