C++智能指针

引用计数技术及智能指针的简单实现

;

基础对象类

;<pre>class ;Point

{

public:

; ; ; ;Point(int ;xVal ;= ;0, ;int ;yVal ;= ;0) ;: ;x(xVal), ;y(yVal) ;{ ;}

; ; ; ;int ;getX() ;const

; ; ; ;{

; ; ; ; ; ; ; ;return ;x;

; ; ; ;}

; ; ; ;int ;getY() ;const

; ; ; ;{

; ; ; ; ; ; ; ;return ;y;

; ; ; ;}

; ; ; ;void ;setX(int ;xVal)

; ; ; ;{

; ; ; ; ; ; ; ;x ;= ;xVal;

; ; ; ;}

; ; ; ;void ;setY(int ;yVal)

; ; ; ;{

; ; ; ; ; ; ; ;y ;= ;yVal;

; ; ; ;}

private:

; ; ; ;int ;x, ;y;

};</pre> ;

辅助类

;<pre>//模板类作为友元时要先有声明

template ;&lt;typename ;T&gt;

class ;SmartPtr;

template ;&lt;typename ;T&gt;

class ;U_Ptr ; ; ; ; ;//辅助类

{

private:

; ; ; ;//该类成员访问权限全部为private,因为不想让用户直接使用该类

; ; ; ;friend ;class ;SmartPtr&lt;T&gt;; ; ; ; ; ; ;//定义智能指针类为友元,因为智能指针类需要直接操纵辅助类

; ; ; ;//构造函数的参数为基础对象的指针

; ; ; ;U_Ptr(T ;*ptr) ;: ;p(ptr), ;count(1) ;{ ;}

; ; ; ;//析构函数

; ; ; ;~U_Ptr()

; ; ; ;{

; ; ; ; ; ; ; ;delete ;p;

; ; ; ;}

; ; ; ;//引用计数

; ; ; ;int ;count;

; ; ; ;//基础对象指针

; ; ; ;T ;*p;

};</pre> ;

智能指针类

;<pre>template ;&lt;typename ;T&gt;

class ;SmartPtr ; ; ;//智能指针类

{

public:

; ; ; ;SmartPtr(T ;*ptr) ;: ;rp(new ;U_Ptr&lt;T&gt;(ptr)) ;{ ;} ; ; ; ; ;//构造函数

; ; ; ;SmartPtr(const ;SmartPtr&lt;T&gt; ;&amp;sp) ;: ;rp(sp.rp)

; ; ; ;{

; ; ; ; ; ; ; ;++rp-&gt;count; ; ; ; ;//复制构造函数

; ; ; ;}

; ; ; ;SmartPtr ;&amp;operator=(const ;SmartPtr&lt;T&gt; ;&amp;rhs) ; ; ; ; ; ;//重载赋值操作符

; ; ; ;{

; ; ; ; ; ; ; ;++rhs.rp-&gt;count; ; ; ; ; ;//首先将右操作数引用计数加1,

; ; ; ; ; ; ; ;if ;(--rp-&gt;count ;== ;0) ; ; ; ; ;//然后将引用计数减1,可以应对自赋值

; ; ; ; ; ; ; ; ; ; ; ;delete ;rp;

; ; ; ; ; ; ; ;rp ;= ;rhs.rp;

; ; ; ; ; ; ; ;return ;*this;

; ; ; ;}

; ; ; ;T ;&amp;operator ;*() ; ; ; ; ; ; ; ; ;//重载*操作符

; ; ; ;{

; ; ; ; ; ; ; ;return ;*(rp-&gt;p);

; ; ; ;}

; ; ; ;T ;*operator ;-&gt;() ; ; ; ; ; ; ;//重载-&gt;操作符

; ; ; ;{

; ; ; ; ; ; ; ;return ;rp-&gt;p;

; ; ; ;}

; ; ; ;~SmartPtr() ; ; ; ; ; ; ; ; ; ;//析构函数

; ; ; ;{

; ; ; ; ; ; ; ;if ;(--rp-&gt;count ;== ;0) ; ; ; ;//当引用计数减为0时,删除辅助类对象指针,从而删除基础对象

; ; ; ; ; ; ; ; ; ; ; ;delete ;rp;

; ; ; ; ; ; ; ;else

; ; ; ; ; ; ; ; ; ; ; ;cout ;&lt;&lt; ;&quot;还有&quot; ;&lt;&lt; ;rp-&gt;count ;&lt;&lt; ;&quot;个指针指向基础对象&quot; ;&lt;&lt; ;endl;

; ; ; ;}

private:

; ; ; ;U_Ptr&lt;T&gt; ;*rp; ; ;//辅助类对象指针

};</pre> ;

使用测试

;<pre>int ;main()

{

; ; ; ;int ;*i ;= ;new ;int(2);

; ; ; ;{

; ; ; ; ; ; ; ;SmartPtr&lt;int&gt; ;ptr1(i);

; ; ; ; ; ; ; ;{

; ; ; ; ; ; ; ; ; ; ; ;SmartPtr&lt;int&gt; ;ptr2(ptr1);

; ; ; ; ; ; ; ; ; ; ; ;{

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;SmartPtr&lt;int&gt; ;ptr3 ;= ;ptr2;

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;cout ;&lt;&lt; ;*ptr1 ;&lt;&lt; ;endl;

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;*ptr1 ;= ;20;

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;cout ;&lt;&lt; ;*ptr2 ;&lt;&lt; ;endl;

; ; ; ; ; ; ; ; ; ; ; ;}

; ; ; ; ; ; ; ;}

; ; ; ;}

; ; ; ;system(&quot;pause&quot;);

; ; ; ;return ;0;

}</pre> ;

参考:

;

  • C++ ;引用计数技术及智能指针的简单实现(文章写的太好了,转过了以后用)
;

相关推荐