我有一个关于 C++ 中运算符重载的返回值的问题。一般来说,我发现了两种情况,一种是按值返回,一种是按引用返回。那么它的底层规则是什么?尤其是在可以连续使用运算符的情况下,如cout<<x<<y
.
例如,当实现一个 + 操作“string + (string)”。您将如何通过 ref 或 val 返回返回值。
最佳答案
有些运算符按值返回,有些按引用返回。一般情况下,结果为新值的运算符(如+、-等)必须按值返回新值,结果为现有值但经过修改的运算符(如<<、>>、+ =、-= 等),应返回对修改后值的引用。
例如,cout
是 std::ostream
, 向流中插入数据是一种修改操作,所以要实现 <<
运算符插入到 ostream
,运算符定义如下:
std::ostream& operator<< (std::ostream& lhs, const MyType& rhs)
{
// Do whatever to put the contents of the rhs object into the lhs stream
return lhs;
}
这样,当你有一个像 cout << x << y
这样的复合语句时, 子表达式 cout << x
首先计算,然后是表达式 [result of cout << x ] << y
被评估。由于运营商<<
在 x
返回对 cout
的引用, 表达式 [result of cout << x ] << y
相当于 cout << y
,正如预期的那样。
相反,对于“字符串 + 字符串”,结果是一个新字符串(两个原始字符串都未更改),因此它必须按值返回(否则您将返回对临时的引用,这是未定义的行为)。
关于c++ - C++中运算符重载的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337213/