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