引用及智能指针 常成员及静态成员介绍

引用

计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象内存磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。

同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。

每一个对象都有一个关联的引用计数 —— 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户程序不可到达它),并可以回收。

每次修改指针引用时(比如通过赋值语句),或者当引用超出范围时,编译器必须生成代码以更新引用的对象的引用计数。如果对象的引用计数变为零,那么运行时就可以立即收回这个块(并且减少被回收的块所引用的所有块的引用计数),或者将它放到迟延收集队列中。

 

 

 

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <iostream>
 
#include <string>
 
using namespace std;
 
class Referenced
 
{
 
public:
 
//初始化这个类,引用计数设为1,并且将p指向传入的地址
 
Referenced(int * pi)
 
{
 
refCount=1;
 
p=pi;
 
}
 
  
 
//引用计数加1
 
int ref()
 
{
 
return ++refCount;
 
}
 
  
 
//引用计数减1
 
int unref()
 
{
 
return --refCount;
 
}
 
  
 
//返回引用计数
 
int count()
 
{
 
return refCount;
 
}
 
  
 
//析构函数,释放掉内存
 
~Referenced()
 
{
 
cout<<"delete referenced"<<endl;
 
delete p;
 
}
 
private:
 
int refCount;//引用计数,表示有多少个变量引用这块内存
 
int * p;//真实的指针
 
};
 
  
 
//对指针进行管理的类,持有一个Referenced类的指针ptr,根据ptr中的
 
//引用计数来判断是否调用delete来删除掉这个指针ptr
 
class  Ref_ptr
 
{
 
public:
 
  
 
//使用int*指针初始化ptr,注意必须要放在初始化列表中
 
Ref_ptr(int * i):ptr(new Referenced(i))
 
{
 
}
 
  
 
//拷贝构造函数,又有一个变量指向了这块内存
 
Ref_ptr(const Ref_ptr & rhs)
 
{
 
ptr=rhs.ptr;//将右操作数的引用计数对象赋值给左操作数
 
ptr->ref();//将它们的应用计数加1
 
}
 
  
 
//赋值操作符,右操作数的引用计数要减1,左操作数的引用计数要加1
 
Ref_ptr & operator=(const Ref_ptr & rhs)
 
{
 
if(&rhs==this)
 
return *this;
 
if(ptr->unref()==0)//赋值操作符,首先将当前类的引用计数减1
 
{
 
cout<<"delete Ref_ptr"<<endl;
 
delete ptr;
 
}
 
ptr=rhs.ptr;//将右操作数的引用计数赋值给当前对象
 
ptr->ref();//引用计数加1
 
return *this;
 
}
 
  
 
//析构函数,引用计数要减1,如果减为0,删除这块内存
 
~Ref_ptr()
 
{
 
if(ptr->unref()==0)
 
{
 
cout<<"delete Ref_ptr"<<endl;
 
delete ptr;
 
}
 
}
 
private:
 
Referenced * ptr;
 
};
 
  
 
int main()
 
{
 
//Referenced rd=new int(4);
 
Ref_ptr r=new int(4);
 
Ref_ptr r1=new int(5);
 
r=r1;
 
  
 
getchar();
 
return 0;
 
}

  

常成员函数:

通常函数体用const修饰

代表该函数不会修改对象数据的值

常成员函数传入的this指针类型并非一般的type  *const  而是const  type  *const

并且不能调用一般成员函数 可以调用常成员函数

 

Mutable修饰成员永远不是const

 

初始化列表

通常使用在构造函数

写法:

构造函数():

数据成员名1(初始化值),

数据成员名2(初始化值),

.....

{

}

写法2:

C11不支持

Class 类名

{

Int a = 0;

Char b = 0;

}

 

静态成员:

静态数据成员所有对象公用该数据成员  一个对象内修改后 其他对象内的也修改

静态成员函数

 可以定义在类内部,也可以定义在外边

 Static type 作用域()::函数名()

{

 

}

静态成员函数不能访问一般成员  因为其并不传入this指针  如若访问 则需手动传入参数

调用方式:函数名调用

类名::函数名();

 

 

 

posted @   特权E5  阅读(275)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示