c++ - 放在运算符重载+语句中时对象丢失

标签 c++ operator-overloading

我正在为学校创建一个字符串类,它包含 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"时,它的内存地址丢失了(或者我不确定它可能被删除了)

最佳答案

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

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

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

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

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

关于c++ - 放在运算符重载+语句中时对象丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33686253/

相关文章:

c++ - 如何在 C++ 中使用模板创建商业库?

c++ - 在它的构造函数中 cout 一个实例

c++ - 重载方括号运算符以接受值

c++ - "operator !="应该始终通过 C++ 中的 "operator =="实现吗?

c++ - 为读和写定义运算符 [ ]

c++ - 重载运算符--无法在赋值中将对象转换为基类型

C++11 移动和重新分配

c++ - 队列的同步问题

c++ - OpenSSL - 通过内存将 X509* x509 转换为文件 BIO*

c++ - 设置和获取一个类中不同类成员的值