[C++]智能指针
2016-02-25 15:03
393 查看
详情见文:
/article/1422721.html
/article/1422721.html
#include <iostream> using namespace std; class U_ptr { private: friend class HasPtr; int *ip; size_t use; U_ptr(int *p) : ip(p), use(1) {}; ~U_ptr() { delete ip; } }; class HasPtr { public: // 定义复制控制操作 HasPtr(int *p, int i) : ptr(new U_ptr(p)), val(i) { cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl; } HasPtr(const HasPtr &orig) : ptr(orig.ptr), val(orig.val) { ++ptr->use; cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl; } HasPtr& operator=(const HasPtr &orig); ~HasPtr() { cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl; if(--ptr->use == 0) delete ptr; } // int *get_ptr() const { return 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 i) const { *ptr->ip = i; } private: U_ptr *ptr; int val; }; HasPtr& HasPtr::operator=(const HasPtr &orig) { ++orig.ptr->use; if (--ptr->use == 0) { delete ptr; } ptr = orig.ptr; val = orig.val; return *this; } int main(void) { int *pi = new int(42); HasPtr *hpa = new HasPtr(pi, 100); // 构造函数 HasPtr *hpb = new HasPtr(*hpa); // 拷贝构造函数 HasPtr *hpc = new HasPtr(*hpb); // 拷贝构造函数 HasPtr hpd = *hpa; // 拷贝构造函数 cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl; hpc->set_ptr_val(10000); cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl; hpd.set_ptr_val(10); cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl; delete hpa; delete hpb; delete hpc; cout << hpd.get_ptr_val() << endl; return 0; }
// 定义值型类 #include <iostream> using namespace std; class Has_Ptr { public: Has_Ptr(const int &p, int i) : ptr(new int(p)), val(i) {} Has_Ptr(const Has_Ptr &orig) : ptr(new int (*orig.ptr)), val(orig.val) {} Has_Ptr& operator=(const Has_Ptr&); ~Has_Ptr() { delete ptr; } int get_ptr_val() 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() const { return ptr; } void set_ptr_val(int p) const { *ptr = p; } private: int *ptr; int val; }; Has_Ptr& Has_Ptr::operator=(const Has_Ptr &orig) { *ptr = *orig.ptr; val = orig.val; return *this; } int main() { int *p = new int(42); Has_Ptr hpd(*p, 10); Has_Ptr hpa(hpd); int *h = new int(20); Has_Ptr hpc(*h, 29); hpd = hpc; cout << hpa.get_int() << endl; cout << hpd.get_ptr_val() << endl; return 0; }
相关文章推荐
- 面试题二 C/C++面试秘笈 之单链表逆转/反转
- AVL树的插入删除操作
- 本科教育忽略的黄金C++<5> 泛型算法-特定容器算法
- 字符串匹配
- c语言入门之项目4.1——利用for循环求1!+2!+3!...12!
- [C++11]_[初级]_[左值引用声明和右值引用声明]
- [C++11]_[初级]_[左值引用声明和右值引用声明]
- 公共字符串计算
- 【c++】必须在类初始化列表中初始化的几种情况
- C/C++内存存储
- 字符串加密解密
- 逐梦C++之七:const限定符
- 程序设计第三次作业--C++计算器初始部分
- C/C++中二维数组和指针关系分析
- C语言之模块化例子(编译环境CODEBLOCK,多文件编译)
- 九度-题目1202:排序 对输入的n个数进行排序并输出
- 10个经典的C语言小程序
- C语言极简入门-VC6.0极速安装-2
- string 与char* char[]之间的转换
- vector 与 set区别