| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 817 人关注过本帖
标题:关于赋值运算符重载的几个问题!求助!
只看楼主 加入收藏
rzcs0608
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-7-27
收藏
 问题点数:0 回复次数:3 
关于赋值运算符重载的几个问题!求助!

我是vc++的初学者,在关于赋值运算符重载方面有几个问题,希望大家能帮忙解决!万分感谢!
内容见附件!谢谢!也可见下:

#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()
{
if(ps)return ps;
else return "0";
}
A &operator=(A &b) //用以下三句替代均出现错误
// A operator=(A &b) 为什么返回值必须是引用类型?否则出错!!!
// A &operator=(A b) 参数采用值传递,不会产生对参数不小心的修改,但为何要采用引用传递?否则出错!!!
// 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()
{
A s1("Computer!"),s2("China!");
cout<<s1.GetS()<<'\t';
cout<<s2.GetS()<<endl;
s1=s2;
cout<<s1.GetS()<<'\t';
cout<<s2.GetS()<<endl;
}


搜索更多相关主题的帖子: 运算符 赋值 重载 
2006-07-27 11:45
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
一下几个问题是因为你没有自定义copy constructor所导致,因为你传递的参数一旦是对象,就会自动调用copy constructor,产生对象副本来传递参数,而你根本就没有定义copy constructor,所以编译器为了自己的需要,帮你产生一个,但是由编译产生的构造函数是有严重的缺陷,因为是给编译器用的,不是给程序用的,虽然可以拷贝对象的值,但是是 "按位拷贝",不是"深拷贝",这个问题很严重,当你对象里面有指针成员的时候,默认的copy constructor拷贝的是内存的首地址 ,并不会因为你有指针 就会帮你执行
if(b.ps)
{
// ps=new char[strlen(b.ps)+1];
strcpy(ps,b.ps);
}
所以当参数传完之后,产生的副本就会析构,而你在析构函数做了 delete[]ps;
所以当你接收到副本传过来的参数后,ps指向的内存块已经没有什么东西了.
所以你加上一个copy constructor 就没有问题了

而你用了引用来传递参数,根本就不会发生copy constructor,所以就不会有副本产生,所以就没有错误

[此贴子已经被作者于2006-7-27 12:06:44编辑过]


c++/C + 汇编 = 天下无敌
2006-07-27 12:05
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
同理,当你返回的参数是对象,不是引用,默认情况下是会调用copy constructor.

c++/C + 汇编 = 天下无敌
2006-07-27 12:16
rzcs0608
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-7-27
收藏
得分:0 

多谢!

2006-07-27 12:21
快速回复:关于赋值运算符重载的几个问题!求助!
数据加载中...
 
   



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

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