C++常规指针类(浅复制),智能指针类(计数类),值行类(深复制) 区别

和恶




三种方法:

·1.常见指针(浅复制)

严重缺点:造成野指针

2.智能指针(技术类)

避免野指针

3.值型类(深复制)

严重缺点:复制大量重复对象,当对象较大时,造成内存的浪费


1.常见指针:



class AHasPtr{


public:
	AHasPtr( int *p,int i):ptr(p),val(i){}
	
	int *get_ptr() const {return ptr;}
	int get_int(){  return val;}

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

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


2.值型类


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;

}


3.智能指针(计数类)

class U_Ptr
{
public :
	int *ptr;
	int *ip;
	size_t use;//记录有多少个对象指向智能指针(计数等于0的时候把它删除)
	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(){  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;}
	int 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;
}


。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值