管理指针成员

void test_BHasPtr(){
	int obj = 0;
	BHasPtr ptr1(&obj, 45);
	BHasPtr ptr2(ptr1);
	cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;
	cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;
	cout << "修改以后" << endl;
	ptr2.set_ptr_val(2);
	ptr2.set_int(22);
	cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;
	cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;
}


class AHasPtr{


public:
	AHasPtr(int *p, int i) :ptr(p), val(i){}

	int *get_ptr() const { return ptr;}
	int get_int() const { return val;}

	void set_ptr(int *p) { ptr = p; }
	void set_int(int i)  { val = i; }

	int get_ptr_val() const{ return *ptr; }
	void set_ptr_val(int val)const { *ptr = val; }
private:
	int val;
	int *ptr;

};




/**********demo.cpp***********/
#include "iostream"
#include "plain-ptr.h"

using namespace std;

void test_AHasPtr()
{
	int i = 42;
	AHasPtr p1(&i, 30);
	AHasPtr p2 = p1;
	cout << p2.get_ptr_val() << endl;

	p1.set_ptr_val(0);
	cout << p2.get_ptr_val() << endl;
	/********野指针*********/
	int *ip = new int(40);
	AHasPtr ptr(ip, 10);
	cout << ptr.get_ptr_val() << endl;
	delete ip;
	/******野指针出现的一步*******/
	cout << ptr.get_ptr_val() << endl;

}

int main()
{
	test_AHasPtr();
	return 0;
}

 

出现的一大串数字就是悬垂指针。

复制构造函数不再复制一个指针。而是分配一个新的int对象并初始化该对象以保存与被复制对象相同的值。每个对象都保存属于自己的int值的不同副本,所以析构函数将不条件删除指针。

/*****深复制*****value-ptr.h**********/
class CHasPtr{
public:
	CHasPtr(const int &p, int i) :ptr(new int (p)), val(i){}
	CHasPtr(const CHasPtr &orig)
		:ptr(new int(*orig.ptr)), val(orig.val){}
	CHasPtr& operator = (const CHasPtr&);

	~CHasPtr() { delete ptr; }

	int *get_ptr() const { return ptr; }
	int get_int() const { return val; }

	void set_ptr(int *p) { ptr = p; }
	void set_int(int i)  { val = i; }

	int get_ptr_val() const{ return *ptr; }
	void set_ptr_val(int val)const { *ptr = val; }
private:
	int val;
	int *ptr;

};
CHasPtr& CHasPtr::operator=(const CHasPtr &rhs)
{
	*ptr = *rhs.ptr;
	val = rhs.val;
	return *this;
}





void test_CHasPtr()
{
	int obj = 0;
	CHasPtr ptr1(obj,42);
	CHasPtr ptr2(ptr1);
	cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;
ptr2.set_ptr_val(6);
ptr2.set_int(48);
cout << "修改以后"<<endl;
cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;
cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;


}





class U_Ptr{
	friend class BHasPtr;
private:
	int *ip;
	size_t use;//计数
	U_Ptr(int *p) :ip(p), use(1){}
	~U_Ptr()  { delete ip; }


};

 


class BHasPtr{
public:
	BHasPtr(int *p, int i) :ptr(new U_Ptr(p)), val(i){}

	BHasPtr(const BHasPtr &orig) :ptr(orig.ptr), val(orig.val)
	{
		++ptr->use;
	}

	BHasPtr& operator = (const BHasPtr&);

	~BHasPtr()
	{
		if (--ptr->use = 0)
			delete ptr;

	}

	int *get_ptr() const { return ptr->ip; }
	int get_int() const { return val; }

	void set_ptr(int *p) { ptr->ip = p; }
	void set_int(int i)  { val = i; }

	int get_ptr_val() const{ return *ptr->ip; }
	void set_ptr_val(int val)const { *ptr->ip = val; }
private:
	int val;
	//int *ptr;
	U_Ptr *ptr;

};

BHasPtr& BHasPtr::operator=(const BHasPtr &rhs)
{
	++rhs.ptr->use;
	if (--ptr->use == 0)
		delete ptr;

	ptr = rhs.ptr;
	val =rhs.val;
	return *this;
}




/****智能指针*********/
void test_BHasPtr(){
	int obj = 0;
	BHasPtr ptr1(&obj, 45);
	BHasPtr ptr2(ptr1);
	cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;
	cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;
	cout << "修改以后" << endl;
	ptr2.set_ptr_val(2);
	ptr2.set_int(22);
	cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;
	cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值