Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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++_Function_Class_Overloading_Operator Keyword - Fatal编程技术网

C++ 使用+=&引用;什么时候+&引用;在类函数中是否重载?

C++ 使用+=&引用;什么时候+&引用;在类函数中是否重载?,c++,function,class,overloading,operator-keyword,C++,Function,Class,Overloading,Operator Keyword,如果您这样做会发生什么:x+=y…当x和y属于同一类时。它在这种情况下仍然有效还是必须是x+y?如果要支持+=,则需要重载运算符+=。仅仅重载+和/或=是不够的 但他确实支持这一点。基本上,您提供了一组非常小的操作符的重载,并使用这些操作符填充了漏洞 为了使+=适用于用户定义的类型,必须重载它。这与该类型的运算符+是否已重载无关。没有基于其他算术运算符1自动生成算术运算符 注意,通常的策略是将操作符+作为非成员重载,即操作符+=。比如说, const function operator+(con

如果您这样做会发生什么:
x+=y…当x和y属于同一类时。它在这种情况下仍然有效还是必须是
x+y

如果要支持
+=
,则需要重载
运算符+=
。仅仅重载
+
和/或
=
是不够的


但他确实支持这一点。基本上,您提供了一组非常小的操作符的重载,并使用这些操作符填充了漏洞

为了使
+=
适用于用户定义的类型,必须重载它。这与该类型的
运算符+
是否已重载无关。没有基于其他算术运算符1自动生成算术运算符

注意,通常的策略是将
操作符+
作为非成员重载,即
操作符+=
。比如说,

const function operator+(const function *) const;
注意:后一个运算符通常表示为一个或两个线性运算符(例如,请参见SO自己的。但这会抑制返回值优化,从而获得很少的收益。我在这里选择了一个更详细的实现,以避免该陷阱,同时不会导致任何清晰度损失



1解决这个“问题”的尝试是失败的,而坏掉的

将不起作用,并以错误告终。如果你想让
+=
起作用,你也需要重载这个操作符,仅仅重载
+
是不够的。

它们是不同的,而且不相关(就编译器而言)

尽管如此,如果您重载其中一个,可能也值得重载另一个以保持一致性

顺便说一句,下面是关于运算符重载的一个很好的解释:

除非您为类重载
+=
,否则不会发生任何事情。此外,您的
+
运算符可能无法工作,因为它需要RHS上的指针。不幸的是,运算符wiki中的
运算符+=
实现是次优的。我可能稍后会更改它。
struct Foo
{
  int i;
  Foo& operator += (const Foo& rhs) 
  { 
    i += rhs.i; 
    return *this;
  }
};

Foo operator+(const Foo& lhs, const Foo& rhs)
{
  Foo result = lhs;
  result += rhs;
  return result;
}