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

#关于运算符重载# 想先重载+=,再写+,结果两个都不会……求救(还是在练习写一个string类时遇到的。)

楼主Artex_xh(一团矛盾)2005-08-02 12:58:24 在 C/C++ / C++ 语言 提问

还是在写个string练习时遇到的,  
  请大家指教!  
  显然,目的是想连接两个c样式字符串。(pString是   mystring中私有成员:char*   pString;)  
  先说+=  
  我这么写  
  mystring&   mystring::operator+=(const   mystring&   aStr)  
  {  
  char*   pTemp=new   char   [strlen(aStr.pString)+strlen(pString)];  
  pTemp=strcat(aStr.pString,pString);  
  strcpy(pString,pTemp);  
  delete[]   pTemp;  
  return   *this;  
  }  
  (s1,s2都是mystring类)  
  用s1+=s2;  
  cout<<endl<<s1.getStr();  
  调用不行,  
  Debug   Error!  
   
  Program:   ...   Documents\Visual   Studio   Projects\ch141\ch141\Debug\ch141.exe  
   
  DAMAGE:   after   Normal   block   (#62)   at   0x00370D10.  
   
   
  (Press   Retry   to   debug   the   application)  
   
  我是cpp新手,思路混乱,一团矛盾,望指教。  
  --------------------------------------------  
  问题之二:  
  如果不从+=来写+,  
  直接写+  
  我用:  
  mystring&   mystring::operator   +(const   mystring&   aStr)   const  
  {  
  return   mystring(strcat(pString,aStr.pString));  
  }  
   
  构造函数如下  
  mystring::mystring(const   char*   pStr)  
  {  
  cout<<endl<<"Using   Default   Constructor.";  
  length=strlen(pStr);  
  pString=   new   char[length+1];  
  strcpy(pString,pStr);  
  }  
  结果出错  
  Access   violation   reading   location   0xcccccccc.  
  没办法了,请教大家,谢! 问题点数:20、回复次数:8Top

1 楼Artex_xh(一团矛盾)回复于 2005-08-02 13:06:42 得分 0

自己先顶了,谢大家  
  Top

2 楼iamwindywolf(疾风之狼)回复于 2005-08-02 13:34:23 得分 10

第一个错误:  
  其实你没写错,你错的地方是内存泄露.在第一段程序里,  
  char*   pTemp=new   char   [strlen(aStr.pString)+strlen(pString)];  
  pTemp=strcat(aStr.pString,pString);  
  这里你出了错,既然已经为pTemp分配了内存,那么在将它指向strcat产生的字符串就没意义了.原来指向的内存块就会发生丢失.所以你在delete的时候就会出现damage.  
   
  第二个错误,好象是因为你返回了一个临时对象的原因吧?看这一行:  
  return   mystring(strcat(pString,aStr.pString));Top

3 楼boxban(冻酸梨)回复于 2005-08-02 13:37:46 得分 10

 
  mystring&   mystring::operator+=(const   mystring&   aStr)  
  {  
  int   len1   =   strlen(pString);  
  int   len2   =   strlen(aStr.pString)   ;  
  char*   pTemp=new   char   [len1   +   len2   +   1];   //+1为'\0'留个座  
  memcpy(pTemp,   pString,   len1);  
  memcpy(pTemp+len1,   aStr.pString,   len2   +   1);  
  delete[]   pString;   //删除旧缓冲区  
  pString   =   pTemp;  
  return   *this;  
  }  
   
  //   operator   +   不好返回引用  
  mystring   mystring::operator   +(const   mystring&   aStr)   const  
  {  
  mystring   tmp("");  
  //同前   +=  
  int   len1   =   strlen(pString);  
  int   len2   =   strlen(aStr.pString)   ;  
  char*   pTemp=new   char   [len1   +   len2   +   1];    
  memcpy(pTemp,   pString,   len1);  
  memcpy(pTemp+len1,   aStr.pString,   len2   +   1);  
   
  tmp.pString   =   pTemp;  
  return   tmp;  
  }  
  Top

4 楼boxban(冻酸梨)回复于 2005-08-02 13:38:43 得分 0

mystring   mystring::operator   +(const   mystring&   aStr)   const  
  {  
  mystring   tmp("");  
  //同前   +=  
  int   len1   =   strlen(pString);  
  int   len2   =   strlen(aStr.pString)   ;  
  char*   pTemp=new   char   [len1   +   len2   +   1];    
  memcpy(pTemp,   pString,   len1);  
  memcpy(pTemp+len1,   aStr.pString,   len2   +   1);  
   
                    delete   []tmp.pString;   //  
  tmp.pString   =   pTemp;  
  return   tmp;  
  }  
  Top

5 楼Artex_xh(一团矛盾)回复于 2005-08-02 14:29:33 得分 0

谢二位  
  boxban(冻酸梨)的+好像不行啊?怎么打印不出来?  
  我用boxban(冻酸梨)   的+=,写+代码如下:  
  mystring   mystring::operator   +(const   mystring&   aStr)   const  
  {  
  return   mystring(*this)+=aStr;  
  }  
  副本构造函数如下:  
  mystring::mystring(mystring&   pNewString)  
  {  
  cout<<endl<<"Using   Copy   Constructor.";  
  char*   pStr=pNewString.getStr();  
  length=pNewString.length;    
  pString=   new   char[length+1];  
  for   (int   i=0;i<length;i++)  
  pString[i]=   pStr[i];  
  pString[i]='\0';  
  }  
  结果返回值总是左操作数,  
  比如s1+s2,总打印出总是s1?  
  无奈,再讨教……Top

6 楼Artex_xh(一团矛盾)回复于 2005-08-02 14:30:50 得分 0

再谢boxban(冻酸梨)的+=Top

7 楼boxban(冻酸梨)回复于 2005-08-02 15:13:13 得分 0

在   +=   实现返回前添加一句:length   =   len1   +   len2;Top

8 楼Artex_xh(一团矛盾)回复于 2005-08-02 15:50:13 得分 0

嘿,真是的,我自己写的类,结果boxban(冻酸梨)比我还清楚……  
  谢了,我都忘了还有那个length  
  谢谢!Top

相关问题

  • #再问运算符重载#还是那个string练习,+=通过,+重载有点问题?
  • 重载运算符
  • 有关string中输出运算符<<重载的问题。
  • String的+是不是像c++一样重载运算符?
  • 如何实现 byte[] 运算符+ 重载,就像string 一样?
  • 求string类的重载小于运算符<的实现代码
  • 怎样重载(),[],=运算符
  • 如何重载+运算符?
  • 关于运算符重载。。
  • 关于运算符重载

关键词

  • pstring
  • ptemp
  • mystring
  • 练习
  • astr
  • 时遇到
  • strlen
  • char

得分解答快速导航

  • 帖主:Artex_xh
  • iamwindywolf
  • boxban

相关链接

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

广告也精彩

反馈

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