免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2136 | 回复: 10
打印 上一主题 下一主题

为什么要返回*this? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-22 14:56 |只看该作者 |倒序浏览
#include<iostream.h>
#include<string.h>

class A{
        char *ps;
public:
        A(){ps=0;}
        A(char *s)
        {
                ps=new char[strlen(s)+1];
                strcpy(ps,s);
        }
        ~A(){if(ps) delete []ps;}
        char *GetS(){return ps;}
        A & operator=(A &b)
        {
                if(ps)delete[]ps;
                if(b.ps){
                        ps=new char[strlen(b.ps)+1];
                        strcpy(ps,b.ps);
                }
                else ps=0;
                return *this;
        }
};

void main(void)
{
        A s1("C++" ), s2("C" );
        cout<<"s1="<<s1.GetS()<<endl;
        cout<<"s2="<<s2.GetS()<<endl;
        s1=s2;
        cout<<"s1="<<s1.GetS()<<endl;
        cout<<"s2="<<s2.GetS()<<endl;
}

A & operator=(A & ) ;这个函数我不太清楚
我不知道,为什么要返回*this,这个*this又赋给了谁?

我就将红色部分改成 void
并且注释了蓝色部分。
在我看来,s1=s2时,编译器解释为s1.operator=(s2)。所以自然是s1的ps做了更新。

所以我不理解,为什么要返回*this?this是指向s1的指针,*this是什么?又赋给了谁?

论坛徽章:
0
2 [报告]
发表于 2006-08-22 15:35 |只看该作者
这个返回的对象用于连续赋值
obj1 = obj2 = obj3
只有两个的时候就丢弃了

还要注意 A & operator=(const A &b) 这样写,防止不小心改了b

论坛徽章:
0
3 [报告]
发表于 2006-08-22 15:35 |只看该作者
可以支持 a = b = c 这种赋值语句。

论坛徽章:
0
4 [报告]
发表于 2006-08-22 17:06 |只看该作者
受益!

论坛徽章:
0
5 [报告]
发表于 2006-08-22 17:29 |只看该作者
有道理,长见识了。

原帖由 rushrush 于 2006-8-22 15:35 发表
这个返回的对象用于连续赋值
obj1 = obj2 = obj3
只有两个的时候就丢弃了

还要注意 A & operator=(const A &b) 这样写,防止不小心改了b

论坛徽章:
0
6 [报告]
发表于 2006-08-22 17:31 |只看该作者
还有个问题
A & operator=(const A &b)
为什么不能是
A  operator=(const A &b)
我试了,出错。这是为什么?

论坛徽章:
0
7 [报告]
发表于 2006-08-22 19:21 |只看该作者
谁来指点一下

论坛徽章:
0
8 [报告]
发表于 2006-08-23 10:03 |只看该作者
再顶一下

论坛徽章:
0
9 [报告]
发表于 2006-08-23 10:57 |只看该作者
还有个问题
A & operator=(const A &b)
为什么不能是
A  operator=(const A &b)
我试了,出错。这是为什么?


看这里的返回值
return *this;

论坛徽章:
0
10 [报告]
发表于 2006-08-23 14:27 |只看该作者
原帖由 wattwang 于 2006-8-22 17:31 发表
还有个问题
A & operator=(const A &b)
为什么不能是
A  operator=(const A &b)
我试了,出错。这是为什么?

如果你用的是 A 而不是 A&,则在当前对象的 operator= 调用返回时(return *this)会使用默认拷贝构造函数生成一个类型为 A 的临时对象。因为使用的是默认拷贝构造函数,临时对象是 *this 的值拷贝,也就是说临时对象和当前对象的 ps 指针指向同一个地址。这个临时对象并没有用到(你没有用 a = b = c 这样的调用),所以会马上析构,调用 ~A,释放临时对象 ps 指向的内存空间。临时对象的指针 ps 指向的地址变为非法地址。因为当前对象的 ps 指针和临时对象的 ps 指针指向同一个地址,此时当前对象的 ps 指针也变为非法,程序运行出现内存错误。

解决的方法是编写拷贝构造函数,分配一块新的内存,不要让两个对象中的指针指向同一块内存。

[ 本帖最后由 isjfk 于 2006-8-23 14:29 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP