重载字符串运算符+

时间:2016-05-01 14:08:34

标签: c++ overloading

我正在尝试创建自己的“String”类。但我有重载operator +的问题。我使运营商+ =运作良好,朋友运营商+有时不能像我计划的那样工作。

String()
{
    length = 0;
    p = new char[1];
    p[0] = '\0';
}
String(const char*s)
{
    length = strlen(s);
    p = new char[length+1];
    strcpy(p, s);
}
String(const String& s)
{
    if (this != &s)
    {
        length = s.length;
        p = new char[s.length + 1];
        strcpy(p, s.p);
    }
}
~String()
{
    delete[]p;
};
String &operator+=(const String&s1)
{
    String temp;
    temp.length = length + s1.length;
    delete[]temp.p;
    temp.p = new char[temp.length + 1];
    strcpy(temp.p, p);
    strcat(temp.p, s1.p);
    length = temp.length;
    delete[]p;
    p = new char[length + 1];
    strcpy(p, temp.p);
    return *this;
}
friend String operator+(const String &s1, const String &s2) 
{
    String temp1(s1);
    temp1 += s2;
    return temp1;
}

如果我像这样使用operator +:String c = a + b;一切都按照计划,但如果我写a = a + b;我得到错误String.exe已触发断点。我应该纠正什么? /////我解决了问题重载operator = Thanks!

1 个答案:

答案 0 :(得分:0)

String operator+=(const String&s1)
{
    int temp_length = length + s1.length;
    String temp(*this);
    length = temp_length;
    delete[]p;
    p = new char[length + 1];
    strcpy(p, temp.p);
    strcat(p, s1.p); //<-- This is the problem
    return *this;
}

friend String operator+(const String &s1, const String &s2) 
{
    String temp1(s1);
    temp1 += s1;
    return temp1;
}

在上面标记的行中,您正在访问s1.p,这与您描述为问题的情况中的this.p相同。严格禁止使用相同数组为两个参数调用strcat。你需要再制作一份副本。

see this answer

根据strcat(3):

strcat()函数将src字符串附加到dest字符串,覆盖dest末尾的终止空字节('\ 0'),然后添加一个终止空字节。 字符串可能不重叠,并且dest字符串必须有足够的空间用于结果。

建议的解决方案:

String operator+=(const String&s1)
{
    int temp_length = length + s1.length;
    String temp(*this);
    length = temp_length;
    delete[]p;
    p = new char[length + 1];
    strcpy(p, temp.p);
    if(p == s1.p)
    {
        String other_temp(s1.p);
        strcat(p, other_temp);
    } else
        strcat(p, s1.p); //<-- no longer a problem
    return *this;
}

friend String operator+(const String &s1, const String &s2) 
{
    String temp1(s1);
    temp1 += s1;
    return temp1;
}