C语言中的C样式字符串和运算符重载

时间:2015-10-02 17:41:11

标签: c++

我试图在我+类的C styled版本上重载string运算符。

除了display()调用显示垃圾值的第二个字符串s2之外,一切都很好。

class string_ {

   char *str;
   int len;

   public :
         ...
         void display()
         {
              cout << str;
         }
};

string_ :: string_()
{
   str = 0;
   len = 0;
}

string_ :: ~string_()
{
   delete []str;
   len = 0;
}


string_ :: string_(char *s,int l)
{
   len = l + 1; // +1 for \0
   str = new char[len];
   int i;
   for(i=0;i<len;i++)
          str[i] = s[i];
   str[i] = '\0';
}

string_ string_ :: operator +(string_ c)
{      
   int j = 0, i = 0;
   string_ s;
   s.len = len + c.len - 1;
   s.str = new char[s.len];
   while (str[i] != '\0')
   {s.str[i] = str[i]; i++;}

   while (c.str[j] != '\0')
   {s.str[i] = c.str[j]; i++; j++; }

   s.str[i] = '\0';
   //The below statements gives the desired output
   cout <<"\nIN operator +" << str;
   cout <<"\nIN operator +" << c.str;
   cout <<"\nIN operator +" << s.str;
   return s;
 }

int main()
{
   char *str = "Hello";
   char *str1 = " World";
   string_ s1(str,5);
   string_ s2(str1,6);
   string_ s3 = s1 + s2;
   cout << "\nstring s1 : ";
   s1.display();
   cout << "\nstring s2 : ";
   s2.display(); //PROBLEM
   cout << "\nConcatenated string : ";
   s3.display();
   return 0;
}

1 个答案:

答案 0 :(得分:4)

您缺少一个正确的复制构造函数,您可以将char数组从一个字符串克隆到另一个字符串。

此外,您的operator+应该将const-ref带到您的字符串类,因为此处不需要副本。

string_ string_ :: operator +(const string_& c)

问题

你的第一个对象有一个指向char数组的指针,例如str=0x1。因为没有复制构造函数,所以指针值会自动复制到字符串的副本中。两个字符串现在具有相同的指针。第一个字符串删除数组,第二个字符串失败。查看Rule of three,其中描述了应该实现哪些功能以避免此问题。 编辑:R Sahu在评论中更快

P.S。由于您使用const-literals将char*更改为const char*

P.S.2请在下次发布MVCE