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

智能指针的问题(现阶段不懂呢)

时间:2017-04-13 18:07:09      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:str   赋值操作符   使用   分享   创建   private   访问   clu   拷贝构造   

#include<iostream>  
using namespace std;

// 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针  
// 这个类的所有成员都是private,我们不希望普通用户使用U_Ptr类,所以它没有任何public成员  
// 将HasPtr类设置为友元,使其成员可以访问U_Ptr的成员  
class U_Ptr
{
	friend class HasPtr;
	int *ip;
	size_t use;
	U_Ptr(int *p) : ip(p), use(1)
	{
		cout << "U_ptr constructor called !" << endl;
	}
	~U_Ptr()
	{
		delete ip;
		cout << "U_ptr distructor called !" << endl;
	}
};

class HasPtr
{
public:
	// 构造函数:p是指向已经动态创建的int对象指针  
	HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i)
	{
		cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl;
	}

	// 赋值构造函数:赋值成员并将使用计数加1  
	HasPtr(const HasPtr& orig) : ptr(orig.ptr), val(orig.val)
	{
		++ptr->use;
		cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl;
	}

	// 赋值操作符   HasPtr& HasPtr::operator = (const HasPtr &rhs)
	HasPtr& operator=(const HasPtr&rhs);

	// 析构函数:如果计数为0,则删除U_Ptr对象  
	~HasPtr()
	{
		cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl;
		if (--ptr->use == 0)
			delete ptr;
	}

	// 获取数据成员  
	int *get_ptr() const
	{
		return ptr->ip;
	}
	int get_int() const
	{
		return val;
	}

	// 修改数据成员  
	void set_ptr(int *p) const
	{
		ptr->ip = p;
	}
	void set_int(int i)
	{
		val = i;
	}

	// 返回或修改基础int对象  
	int get_ptr_val() const
	{
		return *ptr->ip;
	}
	void set_ptr_val(int i)
	{
		*(ptr->ip) = i;
	}
private:
	U_Ptr *ptr;   //指向使用计数类U_Ptr  
	int val;
};
HasPtr& HasPtr::operator = (const HasPtr &rhs)  //注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值  
{
	// 增加右操作数中的使用计数  
	++rhs.ptr->use;//这里相当于++(rhs.ptr->use)
	// 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象  
	if (--ptr->use == 0)
		delete ptr;
	this->ptr = rhs.ptr;   // 复制U_Ptr指针  
	this->val = rhs.val;   // 复制int成员  
	return *this;
}

int main(void)
{
	int *pi = new int(42);
	HasPtr *hpa = new HasPtr(pi, 100);    // 构造函数  
	HasPtr *hpb = new HasPtr(*hpa);     // 拷贝构造函数  
	HasPtr *hpc = new HasPtr(*hpb);     // 拷贝构造函数  
	HasPtr hpd = *hpa;     // 拷贝构造函数  

	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
	hpc->set_ptr_val(10000);
	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
	hpd.set_ptr_val(10);
	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;
	delete hpa;
	delete hpb;
	delete hpc;
	cout << hpd.get_ptr_val() << endl;
	system("pause");
	return 0;
}

  技术分享

 

智能指针的问题(现阶段不懂呢)

标签:str   赋值操作符   使用   分享   创建   private   访问   clu   拷贝构造   

原文地址:http://www.cnblogs.com/xiaochige/p/6704920.html

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