码迷,mamicode.com
首页 > 其他好文 > 详细

13.5.1. 定义智能指针类

时间:2015-04-06 17:12:42      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include<string>
#include<set>
using namespace std;

//智能指针的使用

//智能指针类
class U_ptr
{
	friend class hashptr;
	int *ip;//在hashptr中实际的需要定义的指针成员
	size_t use;//使用次数的计数
	U_ptr(int *p):ip(p),use(1){}//合成构造函数
	~U_ptr(){delete ip;}//析构函数
};

/*
接受一个指针和一个 int 值的 HasPtr 构造函数使用其指针形参创建一个
新的 U_Ptr 对象。HasPtr 构造函数执行完毕后,HasPtr 对象指向一个新分配
的 U_Ptr 对象,该 U_Ptr 对象存储给定指针。新 U_Ptr 中的使用计数为 1,
表示只有一个 HasPtr 对象指向它。 
复制构造函数从形参复制成员并增加使用计数的值。复制构造函数执行完毕
后,新创建对象与原有对象指向同一 U_Ptr 对象,该 U_Ptr 对象的使用计数加 
1。 
*/
class hashptr
{
private:
	U_ptr *p;
	int vi;
public:
	hashptr(int *pi,int i):p(new U_ptr(pi)),vi(i){}
	hashptr(const hashptr& org):p(org.p),vi(org.vi){++p->use;}
	hashptr& operator=(const hashptr&);
	~hashptr(){if(--p->use==0)delete p;}

	int* get_ptr()const{return p->ip;}
	int get_int()const{return vi;}

	void set_ptr(int *newp){p->ip=newp;}
	void set_int(int newint){vi=newint;}

	int get_ptr_vi(){return *p->ip;}
	int set_ptr_vi(int i){*p->ip=i;}

};

//赋值操作
/*
在这里,首先将右操作数中的使用计数加 1,然后将左操作数对象的使用计
	数减 1 并检查这个使用计数。像析构函数中那样,如果这是指向 U_Ptr 对象的
	最后一个对象,就删除该对象,这会依次撤销 int 基础对象。将左操作数中的
	当前值减 1(可能撤销该对象)之后,再将指针从 rhs 复制到这个对象。赋值
	照常返回对这个对象的引用。 
	这个赋值操作符在减少左操作数的使用计数之前使 rhs 的使
	用计数加 1,从而防止自身赋值。
*/
hashptr& hashptr::operator=(const hashptr& org)
{
	++org.p->use;
	if(--p->use==0)
		delete p;
	++p->use;
	p=org.p;
	vi=org.vi;
	return *this;
}

int main()
{

	//cout<<a[1]<<endl;
	system("pause");
	return 1;
}

  

13.5.1. 定义智能指针类

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4396042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!