C++智能指针培训讲学.doc

C++智能指针培训讲学.doc

ID:61931792

大小:82.50 KB

页数:17页

时间:2021-03-31

C++智能指针培训讲学.doc_第1页
C++智能指针培训讲学.doc_第2页
C++智能指针培训讲学.doc_第3页
C++智能指针培训讲学.doc_第4页
C++智能指针培训讲学.doc_第5页
资源描述:

《C++智能指针培训讲学.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、__________________________________________________2015-03-2921:18智能指针类引用计数智能指针(smartpointer)的一种通用实现技术是使用引用计数(referencecount)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。引用计数为0时,删除对象。  其基本使用规则是:  每次创建类的新对象时,初始化指针并将引用计数置为1。当对象作为另一对象的副本而创建时,复制构造函数复制指针并增加与之相应的引用计数的值。对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数的值(如

2、果引用计数减至0,则删除对象),并增加右操作数所指对象的引用计数的值。最后,调用析构函数时,析构函数减少引用计数的值,如果计数减至0,则删除基础对象。  实现引用计数有两种经典策略:一是引入辅助类(包含引用计数型),二是使用句柄类(分离引用计数型)。策略1:引用计数类这个类的所有成员均为private。我们不希望用户使用U_Ptr类,所以它没有任何public成员。将____________________________________________________________________________________________________HasPtr类设置为友元,使其

3、成员可以访问U_Ptr的成员。  U_Ptr类保存指针和使用计数,每个HasPtr对象将指向一个U_Ptr对象,使用计数将跟踪指向每个U_Ptr对象的HasPtr对象的数目。U_Ptr定义的仅有函数是构造函数和析构函数,构造函数复制指针,而析构函数删除它。构造函数还将使用计数置为1,表示一个HasPtr对象指向这个U_Ptr对象。classU_Ptr{friendclassHasPtr;int*ip;intuse;U_Ptr(int*p):ip(p){}~U_Ptr(){deleteip;}};classHasPtr{public:HasPtr(int*p,inti):_ptr(newU_Pt

4、r(p)),_val(i){}HasPtr(constHasPtr&obj):_ptr(obj._ptr),_val(obj._val){____________________________________________________________________________________________________++_ptr->use;}HasPtr&operator=(constHasPtr&);~HasPtr(){if(--_ptr->use==0)delete_ptr;}private:U_Ptr*_ptr;int_val;};接受一个指针和一个int值的HasP

5、tr构造函数使用其指针形参创建一个新的U_Ptr对象。HasPtr构造函数执行完毕后,HasPtr对象指向一个新分配的U_Ptr对象,该U_Ptr对象存储给定指针。新U_Ptr中的使用计数为1,表示只有一个HasPtr对象指向它。  复制构造函数从形参复制成员并增加使用计数的值。复制构造函数执行完毕后,新创建对象与原有对象指向同一U_Ptr对象,该U_Ptr对象的使用计数加1。  析构函数将检查U_Ptr基础对象的使用计数。如果使用计数为0,则这是最后一个指向该U_Ptr对象的HasPtr对象,在这种情况下,HasPtr析构函数删除其U_Ptr指针。删除该指针将引起对U_Ptr析构函数的调用,

6、U_Ptr析构函数删除int基础对象。赋值与引用计数  首先将右操作数中的使用计数加1,然后将左操作数对象的使用计数减1并检查这个使用计数。像析构函数中那样,如果这是指向U_Ptr对象的最后一个对象,就删除该对象,这会依次撤销int基础对象。将左操作数中的当前值减1(可能撤销该对象)之后,再将指针从rhs复制到这个对象。赋值照常返回对这个对象的引用。HasPtr&HasPtr::operator=(constHasPtr&rhs){++rhs.ptr->use;//incrementusecountonrhsfirstif(--ptr->use==0)deleteptr;//ifusecoun

7、tgoesto0onthisobject,deleteitptr=rhs.ptr;//copytheU_Ptrobjectval=rhs.val;//copytheintmemberreturn*this;}这个赋值操作符在减少左操作数的使用计数之前使rhs的使用计数加1,从而防止自身赋值。  如果左右操作数相同,赋值操作符的效果将是U_Ptr基础对象的使用计数加1之后立即减1。值型类复制值型对象

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。