C++ 类中 智能指针 的使用。这个是看的C++primer,在赋值操作符重载函数体里面有一句没看懂……

C++智能指针是为了解决悬垂指针而出现。我想如果复制构造函数里面在复制指针的时候先NEW分配空间,之后再把要复制的指针的值拿进来是不是可以解决??有没有什么局限性?缺点?... C++智能指针是为了解决悬垂指针而出现。我想如果复制构造函数里面在复制指针的时候先NEW分配空间,之后再把要复制的指针的值拿进来是不是可以解决??有没有什么局限性?缺点?
========================================================
下面说正题:先看代码
//=================================================================
//普通类
class HasPtr{
public:
HasPtr(int *p, int i) : ptr(new U_Ptr(p)), val(i) {}
HasPtr(const HasPtr &orig) : ptr(orig.ptr), val(orig.val) { ++ptr->use; }
HasPtr& operator= (const HasPtr&); //赋值操作符

~HasPtr() {
if (--ptr->use == 0){
delete ptr;
}
}
private:
U_ptr *ptr;
int val;
};
//定义赋值操作符
HasPtr& HasPtr::operator=(const HasPtr &rhs ){
++rhs.ptr->use;
if ( --ptr->use == 0 ){ //【【这句什么意思????】】】
delete ptr;
}
ptr = rhs.ptr;
val = rhs.val;
return *this;
}
//=================================================================
//计数器类
class U_Ptr {
private:
friend class HasPtr;
int *p;
size_t use;
U_Ptr(int *p) : ip(p), use(1) { }
~U_Ptr() { delete ip; }
};
=================================

就是那个 赋值操作符 函数定义体中,为什么要将 ptr->use减一??这里又不需要删除一个对象。还有, 赋值操作符重载 函数的参数在实际中是等号的右侧类还是左侧??

求解,C++慢慢发现好深的……还是我太浅了
展开
 我来答
dfdglei
推荐于2017-10-09 · TA获得超过1195个赞
知道小有建树答主
回答量:747
采纳率:100%
帮助的人:772万
展开全部
if ( --ptr->use == 0 ){ //【【这句什么意思????】】】
delete ptr;
}
ptr->use 是用来记录智能指针所对应的真实指针被多少个智能指针给使用了。

比如这个赋值操作符中第一句++rhs.ptr->use;因为传递函数rhs对应的指针需要被新的智能指针使用,所以使用数自增一。而当前智能指针需要更换新的指向值,那么就意味着旧的指向值的使用数要减一,所以有--ptr->use。然后再判断这个值是否已经变成0了,如果为0则意味着就指针已经没有被任何智能指针使用了,所以需要释放其内存,调用delete功能。

函数的参数在实际中是等号的右侧。
如:HasPtr ptr1;
HasPtr ptr2 = ptr1;
更多追问追答
追问
难道说在执行   HasPtr ptr2 = ptr1;   这一句的时候,是先执行HasPtr ptr2;  
也就是先用默认构造函数初始化了ptr2,同时也出现了新的智能指针,
之后再用ptr1的各项值赋予给ptr2。那么之前出现的那个智能指针就要计数减一,之后判断删除。

是这样吗?
追答
呃,抱歉,我写的例子似乎是不对的。
首先这个HasPtr函数式没有默认构造函数的,所以你定义一个HasPtr的变量时,必须要传入对应的参数或者用已经存在的HasPtr来进行拷贝构造。
例子改成:
int *pInt1 = new int;
HasPtr ptr1(pInt, 1); //初始化定义ptr1

如果这时候写一句HasPtr ptr2 = ptr1;这一句其实没有调用等号操作符,调用的是拷贝构造函数HasPtr(const HasPtr &orig);所以我的例子写错了,呵呵。下面继续:

int *pInt2 = new int;
HasPtr ptr2(pInt, 1); //初始化定义ptr2

ptr2 = ptr1; //此时调用了等号操作符进行了复制操作,原本ptr1指向的pInt1使用次数+1,而ptr2初始化时指向的pInt2使用次数-1,判断删除;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式