#include <iostream>
#include "plain-ptr.h"
#include "value-ptr.h"
#include "smart-ptr.h"
using namespace std;
void test_AHasPtr()
{
int i = 42;
AHasPtr p1(&i, 42);
AHasPtr p2 = p1;
cout << p2.get_ptr_val() << endl; // 输出是42
p1.set_ptr_val(0);
cout << p2.get_ptr_val() << endl; // 输出是0
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; // 0 和42
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 0 和42
ptr2.set_ptr_val(6);
ptr2.set_int(66);
cout << "修改后的:" << endl;
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 0 和42
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 6 和66
}
void test_BHasPtr()
{
int obj = 0;
BHasPtr ptr1(&obj, 42);
BHasPtr ptr2(ptr1);
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 0 和42
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 0 和42
cout << "修改后的:" << endl;
ptr2.set_ptr_val(6);
ptr2.set_int(66);
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 6 和42
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 6 和66
}
int main()
{
cout << "常规指针:" << endl;
test_AHasPtr();
cout << endl << "值型类:" << endl;
test_CHasPtr();
cout << endl << "智能指针类:" << endl;
test_BHasPtr();
return 0;
}
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; // 指针复制就是浅复制,复制的是指针的地址,
};
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; } // 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; // 这个是智能指针,U_ptr是一个智能指针类,
};
BHasPtr& BHasPtr::operator = (const BHasPtr& rhs)
{
++rhs.ptr->use; // 右边的++
if (--ptr->use == 0) delete ptr; // 左边的——
ptr = rhs.ptr;
val = rhs.val;
return *this;
}
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;
}