管理指针成员
2016-03-20 21:46
127 查看
#include <iostream> #include "plain-ptr.h" #include "value-ptr.h" #include "smart-ptr.h" using namespace std; void test_AHasPtr() { int i = 42; AHasPtr p1(&i, 42); AHasPtr p2 = p1; cout << p2.get_ptr_val() << endl; // 输出是42 p1.set_ptr_val(0); cout << p2.get_ptr_val() << endl; // 输出是0 int *ip = new int(42); AHasPtr ptr(ip, 10); cout << ptr.get_ptr_val() << endl; delete ip; cout << ptr.get_ptr_val() << endl; } void test_CHasPtr() { int obj = 0; CHasPtr ptr1(obj, 42); CHasPtr ptr2(ptr1); cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 0 和42 cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 0 和42 ptr2.set_ptr_val(6); ptr2.set_int(66); cout << "修改后的:" << endl; cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 0 和42 cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 6 和66 } void test_BHasPtr() { int obj = 0; BHasPtr ptr1(&obj, 42); BHasPtr ptr2(ptr1); cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 0 和42 cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 0 和42 cout << "修改后的:" << endl; ptr2.set_ptr_val(6); ptr2.set_int(66); cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl; // 6 和42 cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl; // 6 和66 } int main() { cout << "常规指针:" << endl; test_AHasPtr(); cout << endl << "值型类:" << endl; test_CHasPtr(); cout << endl << "智能指针类:" << endl; test_BHasPtr(); return 0; }
class AHasPtr { public: AHasPtr(int *p, int i) :ptr(p),val(i){} int *get_ptr() const { return ptr; } int get_int() const { return val; } void set_ptr(int *p) { ptr = p; } void set_int(int i) { val = i; } int get_ptr_val() const { return *ptr; } void set_ptr_val(int val) const { *ptr = val; } private: int val; int *ptr; // 指针复制就是浅复制,复制的是指针的地址, };
class U_Ptr { friend class BHasPtr; // 友元类, private: int *ip; size_t use; // 计数, U_Ptr(int *p) :ip(p), use(1) {} ~U_Ptr() { delete ip; } }; class BHasPtr { public: BHasPtr(int *p, int i) :ptr(new U_Ptr(p)), val(i){} BHasPtr(const BHasPtr &orig) :ptr(orig.ptr), val(orig.val) // 复制构造函数, { ++ptr->use; // 讲计数器加一, } BHasPtr& operator=(const BHasPtr&); //赋值操作符, ~BHasPtr() // 析构函数,将其计数减减, { if (--ptr->use == 0) delete ptr; } int *get_ptr() const { return ptr->ip; } // ptr->ip 这个代表的是智能指针里有一个普通指针 int get_int() const { return val; } void set_ptr(int *p) { ptr->ip = p; } void set_int(int i) { val = i; } int get_ptr_val() const { return *ptr->ip; } void set_ptr_val(int val) const { *ptr->ip = val; } private: int val; //int *ptr; // 指针复制就是浅复制,复制的是指针的地址, U_Ptr *ptr; // 这个是智能指针,U_ptr是一个智能指针类, }; BHasPtr& BHasPtr::operator = (const BHasPtr& rhs) { ++rhs.ptr->use; // 右边的++ if (--ptr->use == 0) delete ptr; // 左边的—— ptr = rhs.ptr; val = rhs.val; return *this; }
class CHasPtr { public: CHasPtr(const int &p, int i) :ptr(new int (p)), val(i){} CHasPtr(const CHasPtr &orig) :ptr(new int(*orig.ptr)), val(orig.val) {} // 这个是复制构造函数, CHasPtr& operator = (const CHasPtr&); // 赋值操作符, ~CHasPtr() { delete ptr; } // 析构函数, int *get_ptr() const { return ptr; } int get_int() const { return val; } void set_ptr(int *p) { ptr = p; } void set_int(int i) { val = i; } int get_ptr_val() const { return *ptr; } void set_ptr_val(int val) const { *ptr = val; } private: int val; int *ptr; // 指针复制就是浅复制,复制的是指针的地址, }; CHasPtr& CHasPtr::operator = (const CHasPtr &rhs) { *ptr = *rhs.ptr; val = rhs.val; return *this; }
相关文章推荐
- 【Chromium中文文档】多进程资源加载
- perl array, scalar and hash
- Android画图工具——Canvas
- 集合-Set
- 读书笔记| (三)ARM9 嵌入式学习:ARM实验篇
- hdu1402A * B Problem Plus
- 英文歌曲:Yesterday Once More(昨日重现)
- 【机房个人重构】数据库设计之物理设计
- 汇编学习3
- SNAT
- webView的使用
- 欢迎使用CSDN-markdown编辑器
- Java - 多线程
- print(),print_r(),echo()的区别
- DOM对象编程练习小结
- Android系统组件BroadcastReceiver
- u插件开发,图解每个js之前的通信
- 整数因子分解
- 猎豹MFC--Socket编程基础TCP服务端和客户端
- 基于dos的多任务系统实现