管理类中的指针成员

一 概述:(详见primer 13.5)

      大多数C++类采用下列三种方法之一管理指针成员:

1.指针成员采取常规指针型行为。这样的类具有指针的所有缺陷(比如:悬挂指针)但无需特殊的复制控制。

2.类可以实现智能指针行为。指针所指的对象是共享的,但类能够防止悬挂指针。(引用计数)
        智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。
  每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除基础对象)。
  实现引用计数有两种经典策略:一是引入辅助类,二是使用句柄(handle)类

3.类采取值型行为(深拷贝。指针所指的对象是唯一的,由每个类对象独立管理。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

//智能指针,使用计数类
#include<iostream>
using namespace std;

class U_Ptr//计数类,用来封装计数和相关指针
{
private:
friend class Base;
        U_Ptr(int *p):ip(p),use(1){}
~U_Ptr()
{
cout<<"~U_Ptr"<<endl;
delete ip;
}
        int *ip;
size_t use;
};
class Base
{
public:
Base(int *p,int i):ptr(new U_Ptr(p)),val(i){}
    Base(const Base &orig):ptr(orig.ptr),val(orig.val)
{
++ptr->use;
}
Base &operator=(const Base &orig)
{
++orig.ptr->use;//防止自我赋值
if(--ptr->use==0)delete ptr;
ptr=orig.ptr;
val=orig.val;
return *this;
}
~Base()
{
cout<<"~base"<<endl;
if(--ptr->use==0)
delete ptr;
}
void Size()
{
cout<<ptr->use<<endl;
}
private:
U_Ptr *ptr;
    int val;
};

int main()
{
int a=10,c=20;
Base b(&a,c);
b.Size();
Base d(b);
b.Size();
}

//深拷贝
class Base
{
public:

Base(const int &p,const int i):ptr( new int(p)),val(i){}

    Base(Base &orig):ptr(new int( *orig.ptr)),val(orig.val){}// 注意不再复制指针,而是值

Base &operator=(const Base &orig)// 不需要分配新的对象
{
*ptr=*orig.ptr;//注意这里传递的是值
val=orig.val;
return *this;
}
private:
int *ptr;
    int val;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值