| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 855 人关注过本帖
标题:类的运算符重载问题
只看楼主 加入收藏
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
结帖率:95.65%
收藏
已结贴  问题点数:6 回复次数:9 
类的运算符重载问题
出现非常诡异的问题,下面的析构函数一旦删除,那么文件运行就正常,否则就报错!!!
不知道是什么情况,请大神帮忙!!!
#include<iostream.h>
#include<string.h>
class String
{
 char *str;
 int len;
 public:
     String(char *s)//构造函数
     {
       len=strlen(s);
       str=new char [len+1];
       strcpy(str,s);
      
     }
     String()
     {
      str=NULL;
      len=0;
     }
     ~String()//析构函数
     {     if (str) delete []str;}
   
     String &operator=(String&s)//等号运算符重载
     {
      if(this==&s) return *this;
      if (str) delete []str;
     
      if(s.str)
      {
       len=strlen(s.str);
       str=new char [len+1];
       strcpy(str,s.str);
      }
      else
      {   
        str=NULL;
        len=0;
      }
      return *this;

      
     }

     void show()//显示函数
     {
     
      cout<<"字符串为:"<<endl;
      cout<<str;
    }
   
     void set(char *s)
     {
      delete []str;
      len=strlen(s);
      str=new char[len+1];
      strcpy(str,s);
      
     }
     
     
     friend String operator+(String &,String &);//友元函数 +重载函数



};
   
   
 

      String operator+(String &s1,String &s2)
     {
      String temp;
      temp.len=s1.len+s2.len;
      temp.str=new char [temp.len+1];
      strcpy(temp.str,s1.str);
      strcat(temp.str,s2.str);
      return temp;
     }

   
 

     void main()
     {
      String str1("hello"),str2("shanghai"),str3;
     
      str3=str1+str2;
      str3.show();

      
      
     

   
     
     }

搜索更多相关主题的帖子: include public 
2012-04-24 22:51
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
收藏
得分:0 
补充问题!!!!!

 String &operator=(String&s)//等号运算符重载
      {
       if(this==&s) return *this;
其中if的这行,为什么是this==&s,除了这句话还能换别的表达方式吗?

 
2012-04-24 22:57
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:2 
#include<iostream>
#include<string.h>
using namespace std;

class String
{
    char *str;
    int len;
    public:
    String(const char *s)//构造函数
    {
        len=strlen(s);
        str=new char [len+1];
        strcpy(str,s);

    }
    String()
    {
        str=NULL;
        len=0;
    }
    ~String()//析构函数
    {     if (str) delete []str;}

    String &operator=(const String &s)//等号运算符重载
    {
        if(this==&s) return *this;
        if (str) delete []str;

        if(s.str)
        {
            len=strlen(s.str);
            str=new char [len+1];
            strcpy(str,s.str);
        }
        else
        {   
            str=NULL;
            len=0;
        }
        return *this;


    }

    void show()//显示函数
    {

        cout<<"字符串为:"<<endl;
        cout<<str;
    }

    void set(char *s)
    {
        delete []str;
        len=strlen(s);
        str=new char[len+1];
        strcpy(str,s);

    }


    friend String operator+(String &,String &);//友元函数 +重载函数



};




String operator+(String &s1,String &s2)
{
    String temp;
    temp.len=s1.len+s2.len;
    temp.str=new char [temp.len+1];
    strcpy(temp.str,s1.str);
    strcat(temp.str,s2.str);
    return temp;
}




int main()
{
    String str1("hello"),str2("shanghai"),str3;
    str3=str1+str2;
    str3.show();
}


就加了个const 应为临时对象是常量
2012-04-25 09:58
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
收藏
得分:0 
回复 3楼 草狼
不行啊,还有没有用啊,你试过了吗?


[ 本帖最后由 教皇 于 2012-4-25 13:15 编辑 ]
2012-04-25 13:11
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:2 
程序代码:
#include <iostream>
#include <cstring>
using namespace std;

class String
{
    char *str;
    int len;
public:
    String(const char *s)
    {
        len = strlen(s);
        str = new char[len+1];
        strcpy(str,s);
    }
    String(void)
    {
        str = NULL;
        len = 0;
    }

    ~String()
    {
        if (str)
        {
            delete [] str;
            str = NULL;
        }
    }

    String &operator=(const String &s)//等号运算符重载
    {
        if(this==&s) return *this;
        if (str) delete []str;

        if(s.str)
        {
            len=strlen(s.str);
            str=new char [len+1];
            strcpy(str,s.str);
        }
        else
        {
            str=NULL;
            len=0;
        }
        return *this;
    }

    void show()//显示函数
    {

        cout<<"字符串为:"<<endl;
        cout<<str;
    }

    void set(char *s)
    {
        delete []str;
        len=strlen(s);
        str=new char[len+1];
        strcpy(str,s);
    }

    friend String operator+(const String &,const String &) ;//友元函数 +重载函数

};

String operator+(const String &s1,const String &s2)
{
    String temp;
    temp.len=s1.len+s2.len;
    temp.str=new char [temp.len+1];
    strcpy(temp.str,s1.str);
    strcat(temp.str,s2.str);
    return temp;
}

int main()
{
    String str1("hello"),str2("shanghai"),str3;

    str3=str1+str2;
    str3.show();
    return 0;
}

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-04-25 13:43
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
收藏
得分:0 
回复 5楼 lonmaor
还是不行啊!我这里编译都通不过
2012-04-25 14:21
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 4楼 教皇
我电脑上能编译通过并能运行
2012-04-25 15:25
cqb_19901201
Rank: 1
等 级:新手上路
帖 子:2
专家分:2
注 册:2012-4-25
收藏
得分:2 
你是在Windows下吗?还是在linux下呢
2012-04-25 20:11
cqb_19901201
Rank: 1
等 级:新手上路
帖 子:2
专家分:2
注 册:2012-4-25
收藏
得分:0 
    有的时候在windows下对于NULL的处理,必须加上str==NULL;
    你这样试试
String &operator=(const char* s)//等号运算符重载
    {
        //if(this==&s) return *this;
        if (str!=NULL) delete []str;

        if(s!=NULL)
        {
            str=s;        }
        else
        {
            str=NULL;
            len=0;
        }
        return *this;
    }

    然后+号运算符修改一下。。
    Char* operator+(const String &s1,const String &s2)
{
    String temp;
    temp.len=s1.len+s2.len;
    temp.str=new char [temp.len+1];
    strcpy(temp.str,s1.str);
    strcat(temp.str,s2.str);
    return temp.str;
}

    你试试。。看看能不能行
2012-04-25 20:23
教皇
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2011-10-6
收藏
得分:0 
回复 9楼 cqb_19901201
我自己发现错误了,少了一个拷贝构造函数,还有一个地方越界了。。。
2012-04-26 20:54
快速回复:类的运算符重载问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019246 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved