博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能指针(使用计数)、定义值型类
阅读量:6325 次
发布时间:2019-06-22

本文共 2405 字,大约阅读时间需要 8 分钟。

1、什么是使用计数?

     使用计数是复制控制成员中使用的编程技术。将一个计数器与类指向的对象相关联,用于跟踪该类有多少个对象共享同一指针。创建一个单独类指向共享对象并管理使用计数。由构造函数设置共享对象的状态并将使用计数置为1。每当由复制构造函数或赋值操作符生成一个新副本时,使用计数加1。由析构函数撤销对象或作为赋值操作符的左操作数撤销对象时,使用计数减少1。赋值操作符和析构函数检查使用计数是否已减至0,若是,则撤销对象。

2、什么是智能指针?智能指针如何与实现普通指针行为的类相区别?

     智能指针是一个行为类似指针但也提供其他功能的类。这个类与实现普通指针行为的类区别在于:智能指针通常接受指向动态分配对象的指针并负责删除该对象。用户分配对象,但由智能指针类删除它,因此智能指针类需要实现赋值控制成员来管理指向共享对象的指针。只有在撤销了指向共享对象的最后一个智能指针后,才能删除该共享对象。使用计数就是实现智能指针类最常用的一个方式。智能指针可防止悬垂指针。

3、什么是值型类?

     是指具有值语义的类,其特征是:对该类对象进行赋值时,会得到一个不同的新副本,对副本所做的改变不会影响原有对象。

使用计数式HasPtr类的版本

1 class U_Ptr   //这个类的所有成员都是 private 的 2 { 3     friend class HasPtr; 4     int *ip; 5     size_t use; 6     U_Ptr(int *p):ip(p), use(1){} 7     ~U_Ptr(){delete ip;} 8 }; 9 10 class HasPtr11 {12 public:13     HasPtr(int *p, int i):ptr(new U_Ptr(p), val(i)){}14     HasPtr(const HasPtr &orgi):ptr(orgi.ptr), val(orgi.val) { ++ptr->use; }15     HasPtr& operator = (const HasPtr&);16     ~HasPtr() { if(--ptr->use == 0) delete ptr; }17     18     int *get_ptr() const19     {20         return ptr->ip;21     }22     int get_int() const23     {24         return val;25     }26     void set_ptr(int *p)27     {28         ptr->ip = p;29     }30     void set_int(int i)31     {32         val = i;33     }34     int get_ptr_val() const35     {36         return *ptr->ip;37     }38     void set_ptr_val(int i)39     {40         *ptr->ip = i;41     }42 private:43     U_ptr *ptr;          //points to use-counted U_Ptr class44     int val;45 };46 47 HasPtr& HasPtr::operator = (const HasPtr &rhs)48 {49     ++rhs.ptr->use;50     if(--ptr->use == 0)51         delete ptr;52     ptr = rhs.ptr;53     val = rhs.val;54     return *this;55 }

实现值型HasPtr类版本

1 class HasPtr 2 { 3 public: 4     HasPtr( const int &p, int i): ptr(new int(p)), val(i)  {  } 5  6     HasPtr( const HasPtr &rhs ): ptr( new int (*rhs.ptr) ), val(rhs.val) {  } 7  8     HasPtr& operator=( const HasPtr&rhs) 9     {10         *ptr = *rhs.ptr;//赋值操作符不需要再分配新对象,它只是必须记得给其指针所指向的对象赋新值,11         val = rhs.val;  //而不是给指针本身赋值12         return *this;13     }14     ~HasPtr()  { delete ptr;  }15     int *get_ptr() const { return ptr;  }16 17     int get_ptr_val() const { return *ptr;  }18     int get_int() const { return val; }19 20     void set_ptr( int *p ) {  ptr = p; }21     void set_int( int i ) {  val = i;  }22 23     void set_ptr_val( int p ) const24     {25         *ptr = p;26     }27 private:28     int *ptr;29     int val;30 };

 

 

转载地址:http://ijmaa.baihongyu.com/

你可能感兴趣的文章
(原創) 今晚重看中森明菜1988年的演唱会 (中森明菜) (日記)
查看>>
让你的Windows Mobile充当wifi路由 - WMWifiRouter
查看>>
常见证书格式和转换
查看>>
什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
查看>>
Atlas Control ToolKit 发布
查看>>
神经网络和深度学习简史(一)
查看>>
世界是数字的
查看>>
袁创:使用反射动态调用ActiveX控件
查看>>
BZOJ 3532: [Sdoi2014]Lis (最大流)
查看>>
Dundas 系列
查看>>
Windows的命令行查看,修改,删除,添加环境变量
查看>>
iOS 图文混排
查看>>
Vue2 第四天学习(Vue的生命周期)
查看>>
1长数组使用
查看>>
GC是什么? 为什么要有GC?
查看>>
数字积分
查看>>
redis 3.0.1 在CentOS上的安装
查看>>
silverlight:如何在后端代码中控制Behaviors
查看>>
TCP/IP三次握手和HTTP过程
查看>>
JQuery EasyUi之界面设计——母版页以及Ajax的通用处理(三)
查看>>