管理指针成员
来源:互联网 发布:sqlite 创建数据库 编辑:程序博客网 时间:2024/06/06 15:50
void test_BHasPtr(){int obj = 0;BHasPtr ptr1(&obj, 45);BHasPtr ptr2(ptr1);cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;cout << "修改以后" << endl;ptr2.set_ptr_val(2);ptr2.set_int(22);cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;}
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;};
/**********demo.cpp***********/
#include "iostream"#include "plain-ptr.h"using namespace std;void test_AHasPtr(){int i = 42;AHasPtr p1(&i, 30);AHasPtr p2 = p1;cout << p2.get_ptr_val() << endl;p1.set_ptr_val(0);cout << p2.get_ptr_val() << endl;/********野指针*********/int *ip = new int(40);AHasPtr ptr(ip, 10);cout << ptr.get_ptr_val() << endl;delete ip;/******野指针出现的一步*******/cout << ptr.get_ptr_val() << endl;}int main(){test_AHasPtr();return 0;}
出现的一大串数字就是悬垂指针。
复制构造函数不再复制一个指针。而是分配一个新的int对象并初始化该对象以保存与被复制对象相同的值。每个对象都保存属于自己的int值的不同副本,所以析构函数将不条件删除指针。
/*****深复制*****value-ptr.h**********/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;}
void test_CHasPtr(){int obj = 0;CHasPtr ptr1(obj,42);CHasPtr ptr2(ptr1);cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;ptr2.set_ptr_val(6);ptr2.set_int(48);cout << "修改以后"<<endl;cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;}
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; }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;};BHasPtr& BHasPtr::operator=(const BHasPtr &rhs){++rhs.ptr->use;if (--ptr->use == 0)delete ptr;ptr = rhs.ptr;val =rhs.val;return *this;}
/****智能指针*********/void test_BHasPtr(){int obj = 0;BHasPtr ptr1(&obj, 45);BHasPtr ptr2(ptr1);cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;cout << "修改以后" << endl;ptr2.set_ptr_val(2);ptr2.set_int(22);cout << ptr1.get_ptr_val() << "," << ptr1.get_int() << endl;cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;}
0 0
- 13.5 管理指针成员
- 管理指针成员
- 管理指针成员
- C++管理指针成员
- c++ 管理指针成员
- 管理指针成员
- C++管理指针成员
- 管理指针成员
- 管理指针成员
- 类的指针成员管理
- 类的指针成员管理
- 类指针型成员管理
- 类中的指针成员管理
- 管理类中的指针成员
- 管理类中的指针成员
- C++ 管理智能指针成员
- 复制控制(管理指针成员)
- 管理指针成员(九)
- WEB后台传数据给前台
- 自定义标签(JspFragment类、invoke方法、开发带属性的标签)
- CAMediaTiming协议
- 用超级终端给手机烧IMEI号
- android ndk-gdb 调试
- 管理指针成员
- mongoose 源码分析 ppt
- Cocos2d中获取锚点所在坐标的方法
- 轻量级JavaEE企业应用实战(十一)
- 231. Power of Two
- ListView+BaseAdapter的使用方法
- 免费公开课视频《神马是数据科学家?》
- iPhone/iOS开发推送C++服务端APNS源代码
- leetcode -- Kth Smallest Element in a BST -- 简单重点