天哪~ 这又哪里出错了嗄?(偶是来送分的……)

etu5 2002-10-10 06:26:22
#include <iostream.h>
#include <string.h>
class person
{
int age;
char *p;
public: person(int a,char *s):age(a)
{
cout<<"You age is "<<age<<endl;
p=new char[10];
strcpy(p,s);
};
person(person& s)
{
p=new char[strlen(s.p)+1];
strcpy(p,s.p);
cout<<"Copy sucuess!"<<endl;
};
putAge()
{
cout<<"Age="<<age<<endl;
};
~person()
{
delete p;
};

};

void main()
{
person a1(20,"DemoSoft");
person a2=a1;
a2.putAge(); //得出的age!=20,而是等于一个随机数……晕嗄
}
...全文
33 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
etu5 2002-10-14
  • 打赏
  • 举报
回复
base n1(19,"TOYOTA");
base n2 = n1;
//如果这里是 base n2; n2 = n1;的话,就输出正确。
//我也不明白为什么直接base n2 = n1就不行。

这个问题不会吧?
应该base n2=n1; 这样没错啦~~ 高手说对吗?
kxw 2002-10-13
  • 打赏
  • 举报
回复
copy ctor中应先释放已有资源,然后重新分配。

问题也许出在这里
===================================================================

我的心太乱
satty 2002-10-13
  • 打赏
  • 举报
回复
如果你要定义拷贝构造函数
那么就必须对每个变量赋值
否则没有赋值的成员变量就是默认值

而如果直接用n2=n1而没有重载=,那么编译器
给一个默认的操作,只是做浅赋值,也就是说
对于基本的变量,没有问题,但对于指针,就有问题。

所以直接用n2=n1而不重载=是不对的
chulizhi 2002-10-13
  • 打赏
  • 举报
回复
我知道你的错误。你看看
person::p(private)
但是strlen(s.p)
应该改为
person::p(public)
否则strlen()外部函数是不能应用的。
这是非法的错误。不知道你同意否?
zhi_chong 2002-10-13
  • 打赏
  • 举报
回复
对不起 ,我发现我说错了。

不是定义不定义的问题。

class base
{
public:
base():age(0),p(NULL){}
base(int n,char *s);
base(base &);
public:
int age;
char *p;

};

int main(int argc, char* argv[])
{
base n1(19,"TOYOTA");
base n2 = n1;
//如果这里是 base n2; n2 = n1;的话,就输出正确。
//我也不明白为什么直接base n2 = n1就不行。

cout<<"n1... "<<n1.age<<" "<<n1.p<<endl;
cout<<"n2... "<<n2.age<<" "<<n2.p<<endl;

return 0;
}

base::base(int n,char *s)
{
age = n;
p = new char[strlen(s)+1];
strcpy(p,s)
}

base::base(base &temp)
{
// age = temp.age;
p = new char[strlen(temp.p)+1];
strcpy(p,temp.p);
}
zhi_chong 2002-10-13
  • 打赏
  • 举报
回复
我试了一下,如果你没有定义拷贝构造函数,则输出正确,如果你自己定义了拷贝构造函数,则一定要每一个数据都要赋值,否则就输出随机的东西。

至少在我的机器上是的,不知对不对。
etu5 2002-10-12
  • 打赏
  • 举报
回复
嗯?没人回答?

自己顶一下!
etu5 2002-10-10
  • 打赏
  • 举报
回复
各位~难道拷贝构造函数都要把每个值都要重新赋一次值吗?
偶的意思是把每个数据成员都要像age那样,要age=s.age一下
这不太麻烦了吗?应该这些代码是默认的操作嗄,即是编译器自动把这些东西赋值,而这个char *p=new char[]就重新执行拷贝构造函数的定义,这是偶的想法,大家不要笑偶~
muche 2002-10-10
  • 打赏
  • 举报
回复
person(person& s)
{
p=new char[strlen(s.p)+1];
strcpy(p,s.p);
cout<<"Copy sucuess!"<<endl;
age=s.age;
p=s.p;
}
muche 2002-10-10
  • 打赏
  • 举报
回复
person(person& s)
{
p=new char[strlen(s.p)+1];
strcpy(p,s.p);
cout<<"Copy sucuess!"<<endl;
age=s.age;
p=s.p;
}
muche 2002-10-10
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <string.h>
class person
{
int age;
char *p;
public: person(int a,char *s):age(a)
{
cout<<"You age is "<<age<<endl;
p=new char[10];
strcpy(p,s);
cout<<p<<endl;
}
person(person& s)
{
//p=new char[strlen(s.p)+1];
//strcpy(p,s.p);
//cout<<"Copy sucuess!"<<endl;
age=s.age;
p=s.p;
}
void putAge()
{
cout<<"age="<<age<<endl;
}

~person()
{
//delete p;
}

};

void main()
{
person a1(20,"DemoSoft");
person a2=a1;
a2.putAge(); //得出的age!=20,而是等于一个随机数……晕嗄
}
Stephen_Ma 2002-10-10
  • 打赏
  • 举报
回复
拷贝构造函数person(person& s)中缺少
age = s.age;

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧