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