c++中的C风格字符串和操作符重载

C style strings and operator overloading in C++

本文关键字:操作符 重载 字符串 风格 中的 c++      更新时间:2023-10-16

我试图在我自己的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 
   str = new char[len];
   int i;
   for(i=0;i<len;i++)
          str[i] = s[i];
   str[i] = '';
}
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] != '')
   {s.str[i] = str[i]; i++;}
   while (c.str[j] != '')
   {s.str[i] = c.str[j]; i++; j++; }
   s.str[i] = '';
   //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;
}

您缺少一个适当的复制构造函数,用于将字符数组从一个字符串克隆到另一个字符串。

你的operator+也应该把const-ref带到你的字符串类,因为这里不需要复制。

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

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

注:因为您使用的是const-literals,所以请将char*更改为const char*

P.S.2请下次发个MVCE