博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++智能指针
阅读量:5775 次
发布时间:2019-06-18

本文共 2186 字,大约阅读时间需要 7 分钟。

 

1、将指针封装成一个智能指针类,当其他类需要使用指针时,可用智能指针类代替,将智能指针类对象作为类成员;

2、智能指针类作为辅助类,包含了引用计数,当主类的对象进行复制、赋值时,智能指针类中引用计数会相应增加或减少,若计数为0时,

    则对对象进行析构;计数不为0时,则不对智能指针类对象进行析构(智能指针类需要动态创建),这样,可以防止出现悬垂指针。

下面的代码有助于加强对智能指针的理解。

1 #include 
2 3 4 //定义仅由HasPtr类使用的U_Ptr类,用于封转使用计数和相关指针 5 class U_Ptr 6 { 7 friend class HasPtr; 8 int *ip; //相关指针 9 size_t use; //使用计数 10 11 U_Ptr(int *p):ip(p),use(1) 12 { 13 } 14 ~U_Ptr() 15 { 16 delete ip; 17 } 18 }; 19 20 //定义HasPtr类 21 class HasPtr 22 { 23 public: 24 //构造函数:p是指向已经动态创建的int对象指针 25 HasPtr(int *p, int i):ptr(new U_Ptr(p)),val(i) 26 {} 27 28 //复制构造函数:复制成员并将使用计数加1 29 HasPtr(const HasPtr &orig) 30 :ptr(orig.ptr),val(orig.val) 31 { 32 ++ptr->use; 33 } 34 //赋值操作符 35 HasPtr & operator = (const HasPtr &); 36 37 //析构函数:如果使用计数为0,则删除U_Ptr对象 38 ~HasPtr() 39 { 40 if(--ptr->use == 0) 41 delete ptr; 42 } 43 44 //获取数据成员 45 int *get_ptr() const 46 { 47 return ptr->ip; 48 } 49 int get_int() const 50 { 51 return val; 52 } 53 54 //修改数据成员 55 void set_ptr(int *p) 56 { 57 ptr->ip = p; 58 } 59 void set_int(int i) 60 { 61 val = i; 62 } 63 64 //返回或修改基础int对象 65 int get_ptr_val() const 66 { 67 return *ptr->ip; 68 } 69 void set_ptr_val(int i) 70 { 71 *ptr->ip = i; 72 } 73 74 private: 75 U_Ptr *ptr; 76 int val; 77 }; 78 79 HasPtr & HasPtr::operator=(const HasPtr &rhs) 80 { 81 //增加右操作数中的使用计数 82 ++rhs.ptr->use; 83 84 //将左操作数对象的使用计数减1, 85 //若该对象的使用计数减至0,则删除该对象 86 if(--this->ptr->use == 0) 87 delete ptr; 88 89 ptr = rhs.ptr; //复制U_Ptr指针 90 val = rhs.val; //复制int成员 91 return *this; 92 } 93 94 int main(int argc, char **argv) 95 { 96 int *p = new int(42); 97 HasPtr *obj = new HasPtr(p,10); 98 99 //HasPtr obj(p, 10);100 HasPtr copy(*obj);101 102 delete obj;103 104 std::cout<
<

参考:《C++ Primer》

转载于:https://www.cnblogs.com/liu-jun/archive/2013/03/01/2939396.html

你可能感兴趣的文章
typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);语句的理解
查看>>
cocos2dx继承结构图
查看>>
jsp 特殊标签
查看>>
[BZOJ] 1012 [JSOI2008]最大数maxnumber
查看>>
使用VMware安装CentOS
查看>>
gauss消元
查看>>
天龙八部源码描述
查看>>
多线程-ReentrantLock
查看>>
数据结构之链表与哈希表
查看>>
[转]基于NodeJS的14款Web框架
查看>>
IIS7/8下提示 HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求...
查看>>
http返回状态码含义
查看>>
提高网站页面加载速度的方法
查看>>
响应式网站对百度友好关键
查看>>
洛谷P2179 骑行川藏
查看>>
暑假周总结三
查看>>
(十八)js控制台方法
查看>>
VB关键字总结
查看>>
虚拟机类加载机制
查看>>
android代码生成jar包并混淆
查看>>