C ++,MyString类,运算符重载

时间:2013-08-12 18:54:53

标签: c++

我在编译代码时收到警告。警告是:引用局部变量'str'返回[默认启用] 我不知道问题或我做错了什么..这是我的代码......

MyString& operator+(MyString &a){
    char *tmp=new char[strlen(szArr)+strlen(a.szArr)+1];
    strcpy(tmp, szArr);
    strcat(tmp, a.szArr);
    MyString str(tmp);
    delete tmp;
    return str;
}
MyString& operator+(char *s){
    if(s)
        return *this;
    char *tmp=new char[strlen(szArr)+strlen(s)+1];
    strcpy(tmp, szArr);
    strcat(tmp, s);
    MyString str(tmp);
    delete tmp;
    return str;
}

在我得到这个警告的时候..我不知道为什么抱怨我回来了对象..

5 个答案:

答案 0 :(得分:3)

当函数返回时,您将返回对本地(堆栈)变量的引用,该变量将超出范围。该对象将无效,因此编译器警告您不要这样做。 确保已定义了复制构造函数并按值返回对象(从返回类型中删除&)。

答案 1 :(得分:1)

如果要返回一个新对象而不是已存在的对象,则不应返回引用。删除引用令牌。 (当函数返回时,您构造的对象将被销毁,因此引用将以无效对象为目标。返回非引用意味着将复制/移动对象,这是您想要的。优化编译器将忽略无论如何都要复制。)

此外,由于您不修改参数,因此应将它们声明为const,以便可以传入const个对象(或字符串文字)。

MyString& operator+(MyString &a);
MyString& operator+(char *s);

应该是:

MyString operator+(MyString const &a);
MyString operator+(char const *s);

请注意,此逻辑是向后的:

if(s)
    return *this;

如果字符串 null,这将是no-op。我认为你的意思是:

if(!s)
    return *this;

答案 2 :(得分:0)

您正在函数中创建一个临时MyString str(tmp);变量,然后您尝试返回对该变量的内存的引用,该变量已超出范围。

我不确定这是您的错误消息的确切原因,但是当您尝试将该返回值用于任何事情时,这将是一个问题。

答案 3 :(得分:0)

错误正是编译器告诉您的:您正在返回对本地变量的引用。局部变量存储在堆栈中,当函数结束时,其局部变量超出范围,因此返回对局部变量的引用具有未定义的行为。
您必须使用按值返回。

答案 4 :(得分:0)

另一个建议:您可以使用带有两个函数参数的运算符表单并保持按引用返回。

查看here示例