🌞

C++之智能指针

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <stdio.h>
#include <iostream>

using namespace std;

class Test
{
private:
    int i;

public:
   Test(int obj)
    {
        i=obj;
        cout <<"Test(int obj)"<<endl;
    }

    int value()
    {
        return i;
    }
    ~Test()
    {
        cout <<"~Test()"<<endl;
    }

};

class Pointer
{
private:
    Test *m_pointer;
public:
    Pointer(Test* pointer = NULL)    //构造函数将空指针赋值给新创建的对象
    {
        m_pointer=pointer;
        cout << "Pointer(Test* pointer=NULL)" <<endl;
    }
    Pointer(const Pointer& obj)     //拷贝构造,要将后者的值置为空,要不delete 后者,相当于delete两次一个空间就会造成段错误
    {
        m_pointer=obj.m_pointer;
        const_cast<Pointer&>(obj).m_pointer=NULL;
    }
    Pointer& operator=(const Pointer& obj)  //和拷贝构造的区别是,赋值是已经申请的内存空间,而拷贝构造后者没有内存空间,故赋值要将前者的内存释放掉
    {
        cout <<"operator="<<endl;
        if(this != &obj)
        {
            delete m_pointer;      //释放前者内存空间
            m_pointer=obj.m_pointer;   //将后者内存指针赋值给一个空的指针,
            const_cast<Pointer&>(obj).m_pointer=NULL;  //将后者释放掉,不然也会造成构造的那种段错误
            cout <<"if(this != &obj)"<<endl;
        }

        return *this;
    }
    bool isNULL()
    {
        return (m_pointer==NULL);
    }

    Test* operator ->()
    {
        return m_pointer;
    }

    Test& operator *()
    {
        return *m_pointer;
    }
    ~Pointer()
    {
        delete m_pointer;
        cout <<"~Pointer()" <<endl;
    }
};

int main(void)
{
    Pointer p1=new Test(1);
    Pointer p3=new Test(3);

    cout << "p1value=" <<p1->value()<<endl;

    Pointer p2=p1;          //此处p1已经为空,
    cout << "p1isNUll=" <<p1.isNULL()<<endl;

    p3=p1;                  //此处p1已经为空,p1赋值给p3只能是一个空指针

    cout << "p3value=" <<p3->value()<<endl;   //空指针肯定打印不出来
    
    cout << "p3isNUll=" <<p3.isNULL()<<endl;  //error
    cout << "p1isNUll=" <<p1.isNULL()<<endl;   //error
    

    return 0;
}
加载评论