菜鸟请教关于复制构造函数
#include <fstream.h>
#include <string.h>
class student
{
protected:
char *name;
public:
student()
{
name=0;
}
student(student &);
~student();
void show();
student(char *a)
{
name=new char[strlen(a)+1];
strcpy(name,a);
}
};
student::student(student &obj)
{
cout<<"\n调用了复制构造函数\n";
name=new char[strlen(obj.name)+1];
strcpy(name,obj.name);
}
student::~student()
{
cout<<"\n调用析构函数\n";
delete [] name;
}
void student::show()
{
cout<<"\nName is:"<<name;
}
student display(char *str)
{
cout<<"\n函数返回对象时\n";
student *stu;
stu=new student(str);
return *stu;
};
void main()
{
student stu2;
char s[20];
cout<<"\n enter your name:";
cin>>s;
stu2=display(s);
stu2.show();
}编译通过运行时报错检查半天还是???
问题点数:40、回复次数:8Top
1 楼plainsong(短歌)()回复于 2004-09-01 12:53:05 得分 0
stu2=display(s);//这句话将调用“拷贝赋值操作符”(而不是“拷贝构造函数”),而你没有定义这个操作符,系统将隐含生成一个,这个拷贝动作是“按位拷贝”的,指针name将直接被赋值到新的对象中,这时就有两个对象的name指向同一个内存块,当这两个对象都被析构时,这个内存块将被释放两次,从而导致错误。
Top
2 楼elegantboy(杰)回复于 2004-09-01 13:06:53 得分 0
"="是要写operate =( const student &s )的成员函数的
Top
3 楼plainsong(短歌)()回复于 2004-09-01 13:10:53 得分 40
解决方法:自己实现“拷贝赋值操作符”:
class student
{
...
public:
student& operator =( const student& source)
{
char * newname = NULL;
if(source.name != NULL)
{
newname = new char[strlen(source.name) + 1];
strcpy(newname, source.name);
}
delete [] name;
name = newname;
}
...
此外还有几个问题:
你的拷贝构造函数的参数最好改为const student&,因为你不需要修改这个参数的值,而这样才可以用常量student拷贝构造变量。
在拷贝构造函数中应该检查obj.name是否为空。(你的代码没有保证它不会为空)
构造函数student(char * a)参数最好是const char *,也要检查a是否为空。Top
4 楼lwj_dxy(豆芽--抵制日货)回复于 2004-09-01 13:33:15 得分 0
upTop
5 楼zylhuo(焱流星)回复于 2004-09-01 23:57:37 得分 0
谢谢啦!Top
6 楼zylhuo(焱流星)回复于 2004-09-02 10:08:38 得分 0
短歌:你好!
不知刚才给你加到分没有?如没有请告诉我怎样给别人加分和怎样结贴,thank you!
Top
7 楼VC_ILoveYou(达哥)回复于 2004-10-30 23:52:55 得分 0
dTop
8 楼VC_ILoveYou(达哥)回复于 2004-10-31 00:02:53 得分 0
能发了,对不起 啊。
将你的 student display(char *str) 换成下面这样就可以运行了。
student& display(char *str)
但这不是解决问题的根本方法,你的写法本来就有问题,会丢失内存。new 了对象没 delete.
写一个拷贝构造函数, 再把你的display函数写成这样就ok了。
student& display(char *str) //功能:一点用处都没有。
{
cout<<"\n函数返回对象时\n";
student stu(str);
return stu;
};
Top




