c++ - C++中运算符重载的返回值

标签 c++ operator-overloading

我有一个关于 C++ 中运算符重载的返回值的问题。一般来说,我发现了两种情况,一种是按值返回,一种是按引用返回。那么它的底层规则是什么?尤其是在可以连续使用运算符的情况下,如cout<<x<<y .

例如,当实现一个 + 操作“string + (string)”。您将如何通过 ref 或 val 返回返回值。

最佳答案

有些运算符按值返回,有些按引用返回。一般情况下,结果为新值的运算符(如+、-等)必须按值返回新值,结果为现有值但经过修改的运算符(如<<、>>、+ =、-= 等),应返回对修改后值的引用。

例如,coutstd::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/

相关文章:

C++ - 使用实例初始化类成员

c++ - 运算符 = 重载

ruby - 我可以使用数学符号调用(调用)Ruby 阶乘方法吗?

c++ - "Ambigous"等效转换 - 我可以让编译器只选择任何一个吗?

c++ - 重载 cout 导致重复定义

c++ - 什么时候应用 ADL?

c++ - 使用动态分配将 char* 复制到另一个 char**

c++ - 调用 map::count 后销毁的函数参数

c++ - 错误: lvalue required while operator overloading++/-- etc

c++ - 重载 operator<< 和 operator!=