C++之管理指针成员

 1 #ifndef PLAIN-PTR_H_INCLUDED
 2 #define PLAIN-PTR_H_INCLUDED
 3 //浅复制
 4 class AHasPtr
 5 {
 6 public:
 7     AHasPtr(int *p,int i):ptr(p),val(i){}
 8     //get方法
 9     int *get_ptr() const {return ptr;}
10     int get_int() const {return val;}
11     //set方法
12     void set_ptr(int *p){ptr=p;}
13     void set_int(int i){val=i;}
14     //
15     int get_ptr_val()const {return *ptr;}
16     void set_ptr_val(int val){*ptr=val;}
17 private:
18     int val;
19     int *ptr;
20 };
21 
22 #endif // PLAIN-PTR_H_INCLUDED
 1 #ifndef VALUE-PTR_H_INCLUDED
 2 #define VALUE-PTR_H_INCLUDED
 3 
 4 //深复制
 5 class CHasPtr
 6 {
 7 public:
 8     //构造函数
 9     CHasPtr(const int &p,int i):ptr(new int(p)),val(i){}
10     //复制构造函数 CHasPtr p1(p2);
11     CHasPtr(const CHasPtr &orig):
12         ptr(new int(*orig.ptr)),
13         val(orig.val){}
14     //赋值构造函数 p1=p2
15     CHasPtr &operator=(const CHasPtr &rhs)
16     {
17         //赋值操作符是把指针指向的对象赋值过来
18         //.的优先级高于*
19         *ptr=*rhs.ptr;
20         val=rhs.val;
21         return *this;
22     }
23     //析构函数
24     ~CHasPtr()
25     {
26         delete ptr;
27     }
28     //get方法
29     int *get_ptr() const {return ptr;}
30     int get_int() const {return val;}
31     //set方法
32     void set_ptr(int *p){ptr=p;}
33     void set_int(int i){val=i;}
34     //
35     int get_ptr_val()const {return *ptr;}
36     void set_ptr_val(int val){*ptr=val;}
37 private:
38     int val;
39     int *ptr;
40 };
41 
42 #endif // VALUE-PTR_H_INCLUDED
 1 #ifndef SMART-PTR_H_INCLUDED
 2 #define SMART-PTR_H_INCLUDED
 3 //智能指针
 4 
 5 class U_Ptr
 6 {
 7     friend class BHasPtr;
 8 private:
 9     int *ip;
10     //计数 计算有多少个对象使用智能指针
11     //当计数为0时删除
12     size_t use;
13     //当有指针传递进来时就将计数值设为1
14     U_Ptr(int *p):ip(p),use(1){}
15     ~U_Ptr()
16     {
17         delete ip;
18     }
19 };
20 
21 class BHasPtr
22 {
23 public:
24     //new U_Ptr(p)将p传递给U_Ptr并赋给ip
25     BHasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i){}
26 
27     BHasPtr(const BHasPtr &orig):
28         ptr(orig.ptr),
29         val(orig.val)
30         {
31             //复制的时候计数加加,因为有多个使用
32             ++ptr->use;
33         }
34 
35     BHasPtr &operator=(const BHasPtr &rhs)
36     {
37         //??????为什么右边的++左边的--
38         ++rhs.ptr->use;
39         if(--ptr->use==0)
40         {
41             delete ptr;
42         }
43         ptr=rhs.ptr;
44         val=rhs.val;
45         return *this;
46     }
47 
48     ~BHasPtr()
49     {
50         //如果减到0就删除指针
51         if(--ptr->use==0)
52         {
53             delete ptr;
54         }
55     }
56     //get方法
57     int *get_ptr() const {return ptr->ip;}
58     int get_int() const {return val;}
59     //set方法
60     void set_ptr(int *p){ptr->ip=p;}
61     void set_int(int i){val=i;}
62     //63     //->优先级高于*
64     int get_ptr_val()const {return *ptr->ip;}
65     void set_ptr_val(int val){*ptr->ip=val;}
66 private:
67     int val;
68     //智能指针
69     U_Ptr *ptr;
70 //    int *ptr;
71 };
72 
73 
74 #endif // SMART-PTR_H_INCLUDED
 1 #include <iostream>
 2 #include "plain-ptr.h"
 3 #include "value-ptr.h"
 4 #include "smart-ptr.h"
 5 
 6 using namespace std;
 7 
 8 void test_AHasPtr()
 9 {
10     int i=42;
11     AHasPtr p1(&i,42);
12     //浅复制
13     AHasPtr p2=p1;
14     cout<<p2.get_ptr_val()<<endl;
15     p1.set_ptr_val(0);
16     cout<<p2.get_ptr_val()<<endl;
17     //申请一抄个整型变量空间,赋初值为42,
18     //并定义一个整型指针a指向该地百址空间
19     int *ip=new int(42);
20     AHasPtr ptr(ip,10);
21     cout<<ptr.get_ptr_val()<<endl;
22     delete ip;
23     cout<<ptr.get_ptr_val()<<endl;
24 
25 }
26 
27 void test_BHasPtr()
28 {
29     int obj=0;
30     BHasPtr ptr3(&obj,42);
31     BHasPtr ptr4(ptr3);
32     cout<<ptr3.get_ptr_val()<<','<<ptr3.get_int()<<endl;
33     cout<<ptr4.get_ptr_val()<<','<<ptr4.get_int()<<endl;
34     ptr4.set_ptr_val(2);
35     ptr4.set_int(22);
36     cout<<ptr3.get_ptr_val()<<','<<ptr3.get_int()<<endl;
37     cout<<ptr4.get_ptr_val()<<','<<ptr4.get_int()<<endl;
38 }
39 
40 void test_CHasPtr()
41 {
42     int obj=0;
43     CHasPtr ptr1(obj,42);
44     CHasPtr ptr2(ptr1);
45     cout<<ptr1.get_ptr_val()<<','<<ptr1.get_int()<<endl;
46     cout<<ptr2.get_ptr_val()<<','<<ptr2.get_int()<<endl;
47     ptr2.set_ptr_val(32);
48     ptr2.set_int(43);
49     cout<<ptr1.get_ptr_val()<<','<<ptr1.get_int()<<endl;
50     cout<<ptr2.get_ptr_val()<<','<<ptr1.get_int()<<endl;
51 }
52 
53 int main()
54 {
55     cout<<"=========常规指针 浅复制==========="<<endl;
56     test_AHasPtr();
57     cout<<"==========深复制=========="<<endl;
58     test_CHasPtr();
59     cout<<"==========智能指针=========="<<endl;
60     test_BHasPtr();
61     return 0;
62 }

 示意图:

原文地址:https://www.cnblogs.com/yh2924/p/12659392.html