运算符重载C ++的字符串连接

时间:2013-09-04 09:52:02

标签: c++ operator-overloading string-concatenation

我无法通过运算符重载连接两个字符串。代码如下。

  #include<iostream>
  #include<string.h>
  using namespace std;
  class String
  {
  char *len;
  public:
         String(char *s);
         void display();
         String(){}
         void setData(char *s);
         //String(String &x); 
         ~String(); 
         String operator+(String);
         void extend(int l);         
   };
   void String::extend(int f)
   {
       len=(char *)realloc(len,(f+1)*sizeof(char));
   }     
   String String::operator+(String x)
   {
     String t;
     printf("%s\n",len);
     t.setData(len);
     t.extend(strlen(len)+strlen(x.len));
     strcat(t.len,x.len);
     printf("%s\n",t.len);
     return (t);

    }       
   String::~String()
   {
       delete len;  

    }                 

  void String::setData(char *s)
  {

      len=(char *)calloc(strlen(s)+1,sizeof(char));
      strcpy(len,s);
   }     
   String::String(char *s)
   {   
       len=(char *)calloc(strlen(s)+1,sizeof(char));                
       strcpy(len,s);
   }
   void String::display()
   {
        printf("%s\n",len);
    }
  int main()
  {

    String a=String("United ");
    String b,c;
    b.setData("States");
    c=a+b;
    c.display();
    system("pause");
    return 0;
   }                                       

问题是字符串是在运算符重载函数中连接的,但是当返回对象并且调用display函数时,输出就是垃圾值。

4 个答案:

答案 0 :(得分:4)

您的代码未遵循Rule Of Three。您应该手动重载copy-constructor和赋值运算符。 此外,您 SHOULN'T delete / malloc / calloc分配的缓冲区上使用realloc,使用free代替。

答案 1 :(得分:2)

使用

<string> 

这是c ++库代替

<string.h> 

这是一个c库。

答案 2 :(得分:0)

能够弄清楚出了什么问题,析构函数的定义就像一个bugaboo。一旦运算符函数超出范围,就会调用析构函数并销毁对象。

答案 3 :(得分:0)

此代码在这里应该可以正常工作。我知道它迟到了,但仍然。

#include<iostream.h>
#include<conio.h>
#include<string.h>

class String
{
    char x[40];

    public:
    String() { }          // Default Constructor

    String( char s[] )
    {
        strcpy(x,s);
    }

    String( String & s )
    {
        strcpy(x,s.x );
    }

    String operator + ( String s2 )
    {
        String res;

        strcpy( res.x,x );
        strcat( res.x,s2.x);

        return(res);
    }

    friend ostream & operator << ( ostream & x,String & s );
};

ostream & operator << ( ostream & x,String & s )
{
    x<<s.x;
    return(x);
}

int main()
{
    clrscr();

    String s1="Vtu";
    String s2="Belgaum";

    String s3 = s1+ s2;      

    cout<<"\n\ns1 = "<<s1;
    cout<<"\n\ns2 = "<<s2;

    cout<<"\n\ns1 + s2 = "<<s3;

    getch();
    return 0;
}