13.5.1. 定义智能指针类

#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;

}

  

你可能感兴趣的:(指针)