html5公司网站欣赏,酒类网站建设策划书,烟台市未成年思想道德建设网站,宁德企业网站建设概述
当有指针指向同一块内存空间时#xff0c;计数器加1#xff0c;没增加一个指向该内存空间的指针#xff0c;计数器加1#xff0c;同理#xff0c;当原本指向该内存空间的指针指向另一块内存#xff0c;计数器减1#xff0c;被指向的另一个内存的计数器加1。下面是…概述
当有指针指向同一块内存空间时计数器加1没增加一个指向该内存空间的指针计数器加1同理当原本指向该内存空间的指针指向另一块内存计数器减1被指向的另一个内存的计数器加1。下面是一个引用计数的一种实现。
示例
直接上代码总共分为三部分第一部分是基本类的定义第二部分是对于基本类的使用类第三部分是实现真正的引用计数功能。
// ReferenceCount.cpp : 定义控制台应用程序的入口点。
//#include stdafx.h
#include stdlib.h
#include iostreamusing namespace std;//基础对象类
class MyPoint
{
public:MyPoint(int a 0,int b 0):x(a),y(b){}void setPoint(int a,int b){x a;y b;}int getX() const {return x;}int getY()const {return y;}
private:int x;int y;
};//辅助类(共享资源含有计数和共享的数据资源)
class SharePoint
{friend class SmartPtr;//友元函数可以访问类中的私有成员变量SharePoint(MyPoint *p):ptr(p),count(0){}~SharePoint(){if(count 0){delete ptr;}}MyPoint *ptr;//共享的数据资源int count;//计数
public:int getCount()const{return count;}
};//智能指针类
class SmartPtr
{
public:SmartPtr(MyPoint *p):ptr(new SharePoint(p)){ptr-count;}SmartPtr(const SmartPtr p)//拷贝构造函数{ptr p.ptr;ptr-count;}SmartPtr operator(const SmartPtr p)//赋值运算符重载{if(this-ptr ! p.ptr){if(--ptr-count 0)//原来指向的内存空间的计数减1{delete ptr;}this-ptr p.ptr;p.ptr-count;//新指向的内存空间的计数增加1}return *this;}SharePoint operator*(){return *ptr;}SharePoint * operator-(){return ptr;}~SmartPtr(){if(ptr-count 0){delete ptr;}else{--ptr-count;}cout引用计数ptr-countendl;}SharePoint *getSourcePtr(){return ptr;}
private:SharePoint *ptr;
};//测试引用计数,可以看出引用计数的计数增加于减少
void testReference()
{MyPoint p(1,2);SmartPtr s1(p);cout引用计数的个数s1.getSourcePtr()-getCount()endl;{SmartPtr s2(s1);cout引用计数的个数s1.getSourcePtr()-getCount()endl;{SmartPtr s3 s2;cout引用计数的个数s1.getSourcePtr()-getCount()endl;}}
}int _tmain(int argc, _TCHAR* argv[])
{//以下只能增加引用计数//MyPoint p(1,2);//SmartPtr s1(p);//cout引用计数的个数s1.getSourcePtr()-getCount()endl;//SmartPtr s2(s1);//cout引用计数的个数s1.getSourcePtr()-getCount()endl;//SmartPtr s3 s2;//cout引用计数的个数s1.getSourcePtr()-getCount()endl;testReference();system(pause);return 0;
}
以上代码是在vs2010上实现的创建的环境是控制台程序自动生成的项目结构如下 以上仅供参考。