c++学习-oop-管理指针成员

在这里插入图片描述
plain-ptr.h

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 *ptr;
	int val;	
};

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& rhs)		//赋值操作符 
	{
		*ptr = *rhs.ptr;
		val = rhs.val;
		return *this;
	}
	~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 *ptr;
	int val;	
};

smart-ptr.h

class U_ptr
{
public:
	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;}
	
	friend class U_ptr;
private:
//	int *ptr;
	U_ptr *ptr;
	int val;	
};

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

main.cpp

/*
	Date: 11/03/21 13:36
	Description: 管理指针成员
	三种方法:
	1.常规指针类(浅复制)	严重缺点:野指针(悬垂指针)
	2.指针指针类(计数类)	避免野指针(悬垂指针)
	3.值型类(深复制) 
*/
#include<iostream>
#include "plain-ptr.h"
#include "value-ptr.h"
#include "smart-ptr.h"
using namespace std;

void test_AHasPtr()
{
	int i = 2;
	AHasPtr p1(&i,42);
	AHasPtr p2 = p1;//浅复制 
	cout<<p2.get_ptr_val()<<endl;
	
	p1.set_ptr_val(0);
	cout<<p2.get_ptr_val()<<endl;
	
	int *ip = new int(42);
	AHasPtr ptr(ip,10);
	cout<<ptr.get_ptr_val()<<endl;
	delete ip;
	cout<<ptr.get_ptr_val()<<endl;//野指针
}

void test_CHasPtr()
{
	int obj = 0;
	CHasPtr ptr1(obj,42);
	CHasPtr ptr2(ptr1);
	cout<<ptr1.get_ptr_val()<<","<<ptr1.get_int()<<endl;
	
	ptr1.set_ptr_val(6);
	cout<<ptr2.get_ptr_val()<<endl;
}

void test_BHasPtr()
{
	int obj1 = 0;
	
	BHasPtr ptr1(&obj1,42);
	BHasPtr ptr2(ptr1);
	cout<<ptr2.get_ptr_val()<<","<<ptr2.get_int()<<endl;
	
	ptr2.set_ptr_val(2);
	ptr2.set_int(22);
	cout<<ptr1.get_ptr_val()<<","<<ptr1.get_int()<<endl;
}

int main()
{
	cout<<"浅复制"<<endl; 
	test_AHasPtr();
	cout<<"深复制"<<endl;
	test_CHasPtr();
	cout<<"智能指针"<<endl;
	test_BHasPtr();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值