Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象在置于运算符重载+;陈述_C++_Operator Overloading - Fatal编程技术网

C++ 对象在置于运算符重载+;陈述

C++ 对象在置于运算符重载+;陈述,c++,operator-overloading,C++,Operator Overloading,我正在为学校创建一个string类,它包含两种数据类型,一种是int-length,另一种是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

我正在为学校创建一个string类,它包含两种数据类型,一种是int-length,另一种是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;
}
当调用字符串u10时,它成功地组合了两个字符串对象,并以字符串equals的形式返回它们


但是当equals变为+加上“G”时,它的内存地址丢失了(或者我不确定它是否被删除了)

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

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

String operator+(constr String& s1, const String& s2)
因此,您将返回一个全新的对象,这是您从二进制
+
运算符中所期望的,引用是一个别名现有对象的对象,在这种情况下不是这样的


操作符+=
中使用它的一种情况是,它确实应该返回一个
字符串&
,因为您正在有效地修改操作符的左边值。

我整天都在做这件事。非常感谢你!