st
7 {
8 int i;
9 public:
10 Test(int i)
11 {
12 cout << "Test(int i)" << endl;
13 this->i = i;
14 }
15 int value()
16 {
17 return i;
18 }
19 ~Test()
20 {
21 cout << "~Test()" << endl;
22 }
23 };
24
25 class Pointer
26 {
27 Test* mp;
28 public:
29 /* 满足需求分析的第一点 */
30 Pointer(Test* p = NULL)
31 {
32 mp = p;
33 }
34
35 /* 以下两个函数做了需求分析的第三点 */
36
37 Pointer(const Pointer& obj)
38 {
39 // delete mp; // 还在拷贝构造,这个时候 mp 还是野指针;
40 mp = obj.mp; // 传递堆空间的控制;
41 const_cast<Pointer&>(obj).mp = NULL;//初始化对象不管之前的;堆空间了,做所有权的转移,保证堆空间最多只能由一个对象被标识;
42 }
43 Pointer& operator = (const Pointer& obj)
44 {
45 if( this != &obj )
46 {
47 delete mp;
48 mp = obj.mp;
49 const_cast<Pointer&>(obj).mp = NULL;
50 }
51
52 return *this;
53 }
54 Test* operator -> () // 返回指针,准备指示;
55 {
56 return mp;
57 }
58 Test& operator * () // 解引用,返回对象;
59 {
60 return *mp;
61 }
62 bool isNull()
63 {
64 return (mp == NULL);
65 }
66 ~Pointer() // 释放成员指针指向的堆空间,需求分析的第二点;
67 {
68 delete mp;
69 }
70 };
71
72 int main()
73 {
74 Pointer p1 = new Test(0); // ==> Test* p1 = new Test(0);
75
76 cout << p1->value() << endl;
77
78 Pointer p2 = p1; // 这里对象拷贝构造函数;
79
80 cout << p1.isNull() << endl;
81
82 cout << p2->value() << endl;
83
84 return 0;
85 }
2,输出结果:
1 Test(int i)
2 0
3 1
4 0
5 ~Test()
3,智能指针没有定义对象运算和对象比较的操作符,所以就满足了需求分 析的第四点;
4,智能指针使用军规:
1,只能用来指向堆空间中的对象或者变量;
(2),不能使用智能指针指向栈空间中的对象;
6,小结:
1,指针特征操作符(-> 和 *)可以被重载;
2,重载指针特征符能够使对象代替指针;
3,智能指针只能用于指向堆空间中的内存;
4,智能指针的意义在于最大程度的避免内存问题;
1,使用智能指针代替 C 中的原生指针,这是智能指针的工程意义;
|