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