| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1452 人关注过本帖
标题:c++primer第四版讲智能指针时在定义HasPtr类的赋值操作符时为什么既使使用计 ...
只看楼主 加入收藏
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
结帖率:100%
收藏
 问题点数:0 回复次数:5 
c++primer第四版讲智能指针时在定义HasPtr类的赋值操作符时为什么既使使用计数加一又减一
可不可以举个具体例子说明一下,说明一下如果不这样做会怎样,请问是不是被赋值的对象已经存在。还有,赋值操作符不是应该返回右操作数吗,为什么好像很多返回左操作数*this
搜索更多相关主题的帖子: 对象 
2011-03-19 14:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:0 
不是所有人都看过“c++primer第四版HasPtr类的定义”,即使看过,也未必还记得。
所以,你的问题估计没几个人懂你在说什么:)
2011-03-19 15:13
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
加1与简1的操作对象不同,LZ看清楚了。
+1是右操作数,-1是左操作数。LZ是否明白了。
至于返回值没你那么说的。这时*this已经与传来的参数相同了,

离恨恰如春草,更行更远还生。
2011-03-19 17:22
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
回复 3楼 玩出来的代码
图片附件: 游客没有浏览图片的权限,请 登录注册

你好,这是我我的截图,我想知道,首先我想先搞懂复制操作符号的含义,他的意思是说,比如我已经定义了int a=3,b=2,那么我执行a=b,(即这两个操作数先存在才可以赋值)时才使用我的重载版本,还是说假如我这样定义 string a=“abcd”,然后我这样定义string b=a,(b不事先存在)在这种情况下,那是不是调用我的重载版本,还是调用复制构造函数的版本,我老是搞不懂像string b=a 的是调用哪个版本。第二个问题时,上面是我从书上截出来的图片,我的理解是那个use是大家共享的,所以加了他有减了他不就使他保持原值吗,这不就和直接执行下面三行代码一样的效果吗(即delete下面三行),虽然书上说防止自身赋值,但我还是搞不懂,不知你知不知道我在说什么,如果知道,麻烦说一下,谢谢。
2011-03-20 19:41
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
前一个问题你其实可以亲自试验下的,
例子
程序代码:
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 后面的三句才不会有问题的。因为堆中的内存还有对象在使用。、、我也不知道你明白了没。

离恨恰如春草,更行更远还生。
2011-03-20 21:02
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
回复 5楼 玩出来的代码
第一个明白了,第二个经你的解释,有点明白了,我在看看,非常感谢你。
2011-03-20 22:50
快速回复:c++primer第四版讲智能指针时在定义HasPtr类的赋值操作符时为什么既使 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021716 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved