CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于C++中运算符重载的问题

楼主TCXHL(随风逝去)2001-05-22 14:57:00 在 C/C++ / C语言 提问

#include<iostream.h>  
  #include<string.h>  
  enum   bool   {true,false};  
  bool   flag;  
  class   strings   {  
                int   length;  
                char   *contents;  
    public:  
                strings(char   *s)  
                {  
    length=strlen(s);  
    contents=new   char[length+1];  
    strcpy(contents,s);  
                }  
                strings()  
                {  
    length=0;  
    contents=NULL;  
                }  
                ~strings()   {   delete   contents;}  
                int   getlength()   {return   length;}  
                strings   operator   +   (strings   str1);  
                bool   operator   <   (strings   str1);  
                void   print()   {   cout<<contents<<"       "<<length<<"\n";}  
  };  
  strings   strings::operator   +   (strings   str1)  
  {  
      strings   str2;  
      str2.length=length+str1.length;  
      str2.contents=new   char[str2.length+1];  
      strcat(str2.contents,contents);  
      strcat(str2.contents,str1.contents);  
      return   str2;  
  }  
  bool   strings::operator   <   (strings   str1)  
  {  
      if   (length>str1.length)  
      {  
          if   (strcmp(contents,str1.contents)<=0)   {   flag=true;}  
          else   flag=false;  
      }  
      else   flag=false;  
      return   flag;  
  }  
  main()  
  {  
      strings   obj1("The   "),obj2("Object"),obj3,obj4("Hello   World");  
      cout<<"obj1   is   ";   obj1.print();  
      cout<<"obj2   is   ";   obj2.print();  
      obj3=obj1+obj2;  
      cout<<"obj1+obj2=obj3=";     obj3.print();  
      cout<<"obj4   is   ";   obj4.print();  
      if   (obj2<obj3==true)   cout<<"obj2   is   obj3   substring"<<"\n";  
      if   (obj4<obj3==true)   cout<<"obj4   is   obj3   substring"<<"\n";  
      else   cout<<"obj4   is   not   obj3   substring"<<"\n";  
      return   1;  
  }  
   
  哪位大虾赐教错在哪里!  
  问题点数:20、回复次数:9Top

1 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-05-22 15:25:00 得分 0

重载operator   +时  
  str2是在栈中建立的临时变量,函数结束时就释放掉了,要作为左值赋obj3  
  需要再写一个拷贝构造函数  
  strings(   strings   const&   str1   );  
  和重载运算符=  
  string&   operator   =   (   strings   const&   str1   );Top

2 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-05-22 15:28:00 得分 15

#include<iostream.h>  
  #include<string.h>  
  enum   bool   {true,false};  
  bool   flag;  
  class   strings   {  
  int   length;  
  char   *contents;  
  public:  
  strings(char   *s)  
  {  
  length=strlen(s);  
  contents=new   char[length+1];  
  strcpy(contents,s);  
  }  
  strings():length(0),contents(NULL){}  
   
  strings(   strings   const&   str1)  
  {  
  length=str1.length;  
  contents=new   char[length+1];  
  strcpy(contents,str1.contents);  
  }  
   
  ~strings()  
  {  
  if(   contents   )  
  delete   contents;  
  }  
   
  int   getlength()   {return   length;}  
  strings   operator   +   (strings   str1);  
  bool   operator   <   (strings   str1);  
  strings&   operator   =   (strings   const&   str1   )  
  {  
  length=str1.length;  
  contents=new   char[length+1];  
  strcpy(contents,str1.contents);  
                                  return   *this;  
  }  
  void   print(){   cout<<contents<<"     "<<length<<"\n";}  
  };  
  strings   strings::operator   +   (strings   str1)  
  {  
  strings   str2   ;  
  str2.length=length+str1.length;  
  str2.contents=new   char[str2.length+1];  
  strcpy(str2.contents,contents);  
  strcat(str2.contents,str1.contents);  
  return   str2;  
  }  
  bool   strings::operator   <   (strings   str1)  
  {  
  if   (length>str1.length)  
  {  
  if   (strcmp(contents,str1.contents)<=0)  
  flag=true;  
  else  
  flag=false;  
  }  
  else  
  flag=false;  
  return   flag;  
  }  
  main()  
  {  
  strings   obj1("The   "),obj2("Object"),obj3,obj4("Hello   World");  
  cout<<"obj1   is   ";  
  obj1.print();  
  cout<<"obj2   is   ";  
  obj2.print();  
  obj3=obj1+obj2;  
  cout<<"obj1+obj2=obj3=";  
  obj3.print();  
  cout<<"obj4   is   ";  
  obj4.print();  
  if   (obj2<obj3==true)  
  cout<<"obj2   is   obj3   substring"<<"\n";  
  if   (obj4<obj3==true)  
  cout<<"obj4   is   obj3   substring"<<"\n";  
  else   cout<<"obj4   is   not   obj3   substring"<<"\n";  
  return   1;  
  }  
  Top

3 楼TCXHL(随风逝去)回复于 2001-05-23 11:07:00 得分 0

可是<的判断结果似乎仍然不正确Top

4 楼TCXHL(随风逝去)回复于 2001-05-23 11:13:00 得分 0

可是<的判断结果似乎仍然不正确Top

5 楼TCXHL(随风逝去)回复于 2001-05-23 11:14:00 得分 0

可是<的判断结果似乎仍然不正确Top

6 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-05-23 11:20:00 得分 5

这时你自己的代码编错了  
   
  bool   strings::operator   <   (strings   str1)  
  {  
          if   (length<=str1.length)//这里不应该为>  
                  {  
                  if   (strcmp(contents,str1.contents)<=0)  
                          flag=true;  
                  else  
                          flag=flase;  
                  }  
          else  
                  flag=false;  
          return   flag;  
  }  
  Top

7 楼qingsong99(青松)回复于 2001-05-23 14:40:00 得分 0

正如holyfire(发了才的众神之焰)  
  所改,string   operate+(string   str1)应该为string   &operate+(string   str1)  
  如不想改,可以添加一个拷贝构造函数。Top

8 楼glhorse(happy day)回复于 2001-05-23 14:56:00 得分 0

,.,Top

9 楼stonechina()回复于 2001-05-25 16:39:00 得分 0

在operator=执行过程中,编译器(VC6)好象都用到了一个中间变量:  
      obj3   =_meddle_variant;  
      _meddle_variant.~strings();//释放  
   
  为何多了拷贝构造函数后中间变量会:  
  在opetator+函数RETURN时会自动调用拷贝构造函数拷贝str2,生成了一个中间变量。  
   
  而没有拷贝构造函数时:  
  operator+函数的RETURN只是将str2.length&str2.contents送到一个好象是中间变量的内存区域,最后在释放中间变量时。因试图delete   str2.contents时出错。  
   
  这拷贝构造函数和其他的构造函数,编译器是如何决定何时和地调用?  
  象本例中编译器“悄悄”调用,编码时又如何觉察?  
  假如类中没有指针成员变量,是否可以不声明拷贝构造函数?  
  Top

相关问题

  • 关于C++中类的运算符重载的问题
  • 在Dev-C++重载运算符问题
  • c++中流操作和运算符的重载在vc中还重要吗?
  • 关于 Effective C++ 的 Item 7 中重载 new 运算符的问题
  • 请教在C++中运算符++前置后置operator重载,谢谢!
  • 在VC中的运算符重载.
  • 运算符重载中的CONST问题
  • COM中可以重载运算符吗?
  • 重载运算符
  • C++中定义重载运算符函数的返回值为常引用时引起的一个问题

关键词

  • contents
  • str1
  • length
  • strcpy
  • bool
  • operator
  • char
  • include

得分解答快速导航

  • 帖主:TCXHL
  • holyfire
  • holyfire

相关链接

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

广告也精彩

反馈

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