引用及智能指针 常成员及静态成员介绍
引用
计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。
同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。
每一个对象都有一个关联的引用计数 —— 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户程序不可到达它),并可以回收。
每次修改指针引用时(比如通过赋值语句),或者当引用超出范围时,编译器必须生成代码以更新引用的对象的引用计数。如果对象的引用计数变为零,那么运行时就可以立即收回这个块(并且减少被回收的块所引用的所有块的引用计数),或者将它放到迟延收集队列中。
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指针 如若访问 则需手动传入参数
调用方式:函数名调用
类名::函数名();
学如逆水行舟,不进则退。
博客园技术交流群 群 号:1073255314
(本群没人,刚刚建立 -_-!!! )
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步