【问题标题】:Objected is lost when being placed in operator overload + statement放入运算符重载+语句时,对象丢失
【发布时间】:2015-11-13 05:01:00
【问题描述】:

我正在为学校创建一个包含 2 种数据类型、一个 int 长度和一个 char* buf 的字符串类。

其中一个构造函数要求我重载 + 运算符。

String s10("DEF");
String t10('H');
String u10("ABC" + s10 + "G" + t10 + 'I');

我用以下代码重载了 + 运算符

String& operator + (const String& s1, const String& s2){

String equals;
equals.length = s1.length + s2.length;
equals.buf = new char[equals.length + NULL_OFFSET];
strcpy(equals.buf, s1.buf);
strcat(equals.buf, s2.buf);
return equals;
}

调用String u10时,成功组合了2个String对象,并以String equals的形式返回。

但是当 equals 变成带有“G”的 + 时,它的内存地址会丢失(或者它可能被删除了,我不确定)

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    问题是您正在返回一个非const 对分配在堆栈上的局部变量的引用,当退出声明范围时该变量无效。

    但是没有理由返回引用,operator+ 应该返回一个值,而不是对值的引用:

    String operator+(constr String& s1, const String& s2)
    

    所以您返回一个全新的对象,这是您对二进制 + 运算符的期望,引用是现有对象的别名,在这种情况下不是这种情况。

    operator+= 中使用它的情况确实应该返回String&,因为您正在有效地修改运算符的左侧值。

    【讨论】:

    • 我整天都被困在这上面。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多