#include <iostream>
#include <conio.h>
using namespace std;
class U_Ptr //定义一个智能指针
{
friend class HasPtr;
int *ip;
size_t used;//使用记数
U_Ptr(int *p): ip(p),used(1)
{ }
~U_Ptr()
{
delete ip;
}
};
class HasPtr
{
public:
HasPtr(int *p,int i) : ptr(new U_Ptr(p)),val(i)
{ }
HasPtr(const HasPtr& obj) : ptr(obj.ptr) , val(obj.val) // 复制构造函数
{
++ ptr->used; // 复制一次,引用计数加一
}
HasPtr& operator=(const HasPtr& rhs)
{
++rhs.ptr->used;
if(--ptr->used == 0)
delete ptr->ip;
ptr = rhs.ptr;
val = rhs.val;
return *this;
}
~HasPtr()
{
if(--ptr->used == 0)
delete ptr->ip;
}
private:
U_Ptr *ptr;
int val;
public:
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()
{
return *ptr->ip;
}
void set_ptr_val(int i)
{
*ptr->ip = i;
}
int get_used_num() const
{
return ptr->used;
}
};
void Tmp(HasPtr &test,HasPtr &test2,HasPtr &test3)
{
HasPtr test4 = test;
cout<<"Tmp 1"<<endl;
cout<<test.get_ptr_val()<<" "<<test.get_used_num()<<endl;
cout<<test2.get_ptr_val()<<" "<<test2.get_used_num()<<endl;
cout<<test3.get_ptr_val()<<" "<<test3.get_used_num()<<endl;
cout<<test4.get_ptr_val()<<" "<<test4.get_used_num()<<endl;
}
int main()
{
int *p = new int(55) , i=100;
HasPtr test(p,i);
cout<<"the 1"<<endl;
cout<<test.get_ptr_val()<<" "<<test.get_used_num()<<endl;
HasPtr test2(test);
cout<<"copy 1"<<endl;
cout<<test.get_ptr_val()<<" "<<test.get_used_num()<<endl;
cout<<test2.get_ptr_val()<<" "<<test2.get_used_num()<<endl;
HasPtr test3 = test;
cout<<"= 1"<<endl;
cout<<test.get_ptr_val()<<" "<<test.get_used_num()<<endl;
cout<<test2.get_ptr_val()<<" "<<test2.get_used_num()<<endl;
cout<<test3.get_ptr_val()<<" "<<test3.get_used_num()<<endl;
Tmp(test,test2,test3);
cout<<"Tmp out 1"<<endl;
cout<<test.get_ptr_val()<<" "<<test.get_used_num()<<endl;
cout<<test2.get_ptr_val()<<" "<<test2.get_used_num()<<endl;
cout<<test3.get_ptr_val()<<" "<<test3.get_used_num()<<endl;
getch();
return 0;
}
//the 1
//55 1
//copy 1
//55 2
//55 2
//= 1
//55 3
//55 3
//55 3
//Tmp 1
//55 4
//55 4
//55 4
//55 4
//Tmp out 1
//55 3
//55 3
// 55 3