CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

菜鸟请教关于复制构造函数

楼主zylhuo(焱流星)2004-09-01 12:47:12 在 C/C++ / C++ 语言 提问

#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

相关问题

  • 复制构造函数的疑问
  • 复制构造函数不懂
  • 复制构造函数的使用
  • 复制构造函数和赋值函数的问题。。。。求达人讲解。。。。
  • 关于模板拷贝构造函数(模板拷贝复制函数)
  • 关于复制构造函数的一个问题。
  • 复制构造函数的问题,题目中(求助)
  • 关于复制构造函数的一个问题
  • 再问复制构造函数的调用
  • 菜鸟问题:关于构造函数。

关键词

  • 函数
  • 拷贝
  • 内存
  • source
  • student
  • 构造
  • 操作符
  • 赋值
  • newname
  • stu2

得分解答快速导航

  • 帖主:zylhuo
  • plainsong

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo