与+相比,重载+ =

时间:2013-03-24 13:31:27

标签: c++

我需要为MyString类重载operator +和+ =。

MyString.h

    class MyString
    {
        char* m_pStr;   
    };

主要

    MyString s1("ABC"), s2("kkk");
    MyString s("S");//GMV
    s1 +=s;
    s2 = s+s1;
    stop

MyString.cpp

MyString MyString:: operator + (const MyString & rhs){
    char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
    return MyString(tmp);
};

MyString & MyString:: operator += (const MyString & rhs){
    char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
    return MyString(tmp);
};

char* MyString:: create_tmp_string(char * one, char * two){
    int total_length = strlen(one) + strlen(two);
    char * tmp = new char[total_length + 1];
    tmp[0] = '\0';
    strcat(tmp, one);
    strcat(tmp, two);   
    return tmp;
}

我的问题是:

s2 = s+s1; // Working
s1 +=s; // Not working.

好吧,当我逐步执行代码时:

MyString & MyString:: operator += (const MyString & rhs){
    char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
    return MyString(tmp);
};
tmp turnes将成为SABC。但是s1将不包含SABC并且仍然持有ABC。

你能帮帮我吗?

4 个答案:

答案 0 :(得分:4)

您的operator+=应该返回*this而不是本地变量。

答案 1 :(得分:4)

MyString & MyString:: operator += (const MyString & rhs){
    char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
    return MyString(tmp);
};

应该是这样的

MyString & MyString:: operator += (const MyString & rhs){
    char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
    *this = MyString(tmp);
    return *this;
};

假设您的operator =正常工作。

但实际上有一种更简单的方法。只需根据另一个运算符编写一个运算符,例如使用operator + =

编写运算符+
MyString operator+(const MyString& x, const MyString& y)
{
    MyString res = x;
    res += y;
    return res;
}

或者你可以反过来做到这一点

MyString& MyString::operator+=(const MyString& x)
{
    *this = *this + x;
    return *this;
}

答案 2 :(得分:3)

operator+=通常是会员功能;它修改了左侧参数并返回对*this的引用。 operator+通常是一个非成员函数,它返回一个新创建的对象;它可以使用operator+=轻松实现,因此不需要知道任何实现细节。

答案 3 :(得分:2)

operator +=中你应该重写* this的值。

MyString & MyString:: operator += (const MyString & rhs){
    char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
    // seems you own m_pStr. In this case 
    // don't forget, you should make deep copy in copy constructors and 
    // delete in destructor.
    delete this->m_pStr;
    this->m_pStr = tmp;
    return *this;
};

之后,您可以使用operator +

撰写operator +=
MyString operator + (const MyString& rhs){
    MyString copy = *this;
    return copy += rhs;
}