注册 登录
编程论坛 C++教室

c++primer第四版讲智能指针时在定义HasPtr类的赋值操作符时为什么既使使用计数加一又减一

specilize 发布于 2011-03-19 14:01, 1452 次点击
可不可以举个具体例子说明一下,说明一下如果不这样做会怎样,请问是不是被赋值的对象已经存在。还有,赋值操作符不是应该返回右操作数吗,为什么好像很多返回左操作数*this
5 回复
#2
rjsp2011-03-19 15:13
不是所有人都看过“c++primer第四版HasPtr类的定义”,即使看过,也未必还记得。
所以,你的问题估计没几个人懂你在说什么:)
#3
玩出来的代码2011-03-19 17:22
加1与简1的操作对象不同,LZ看清楚了。
+1是右操作数,-1是左操作数。LZ是否明白了。
至于返回值没你那么说的。这时*this已经与传来的参数相同了,
#4
specilize2011-03-20 19:41
回复 3楼 玩出来的代码
只有本站会员才能查看附件,请 登录

你好,这是我我的截图,我想知道,首先我想先搞懂复制操作符号的含义,他的意思是说,比如我已经定义了int a=3,b=2,那么我执行a=b,(即这两个操作数先存在才可以赋值)时才使用我的重载版本,还是说假如我这样定义 string a=“abcd”,然后我这样定义string b=a,(b不事先存在)在这种情况下,那是不是调用我的重载版本,还是调用复制构造函数的版本,我老是搞不懂像string b=a 的是调用哪个版本。第二个问题时,上面是我从书上截出来的图片,我的理解是那个use是大家共享的,所以加了他有减了他不就使他保持原值吗,这不就和直接执行下面三行代码一样的效果吗(即delete下面三行),虽然书上说防止自身赋值,但我还是搞不懂,不知你知不知道我在说什么,如果知道,麻烦说一下,谢谢。
#5
玩出来的代码2011-03-20 21:02
前一个问题你其实可以亲自试验下的,
例子
程序代码:

class A
{
public:
    A()
    {
        cout<<"这是构造函数"<<endl;
    }
    A(const A& a)
    {
        cout<<"这是拷贝构造函数"<<endl;
    }
    A& operator=(const A& a)
    {
        cout<<"这是赋值重载函数"<<endl;
        return *this;
    }
};
int main()
{
    A a;
    A b;
    a=b;
    A c=a;
    return 0;
}


第二个问题,书上写的也没错,++rhs.ptr->use; 这个加1是有操作数的。if(--ptr->use)这里就默认的是this指针的。让rhs先加1也起到自身赋值的检测,先+1使用计数至少是2,若是自身赋值,在-1这时是没问题的。呃,你没理解对。
假如在主函数中有这样几句。

char *p=new char[20];
char *q=new char[20];
HasPtr a(p,0);
HasPtr b(q,0);
a=b;//看这句,会调用赋值重载,那么a所指的对内存是不是要释放呢,你若不调用delete 怎么释放呢,调用函数时b的计数+1,a的-1,那么a.ptr->use为0了调用析构函数释放内存,
若有这样一句,a=a;//这个就是自身赋值了,只有这种情况下,在重载+中用delete 后面的三句才不会有问题的。因为堆中的内存还有对象在使用。、、我也不知道你明白了没。
#6
specilize2011-03-20 22:50
回复 5楼 玩出来的代码
第一个明白了,第二个经你的解释,有点明白了,我在看看,非常感谢你。
1