【发布时间】:2010-08-19 20:33:32
【问题描述】:
【问题讨论】:
-
如果您为两个对象重载 +,编译器不会知道任何关于 += 的信息。所以 - 答案是 YES。
-
您可能还想重载相关的运算符,例如 ++ 和 - 的集合。
【问题讨论】:
你需要重载两者。
但是,如果您颠倒顺序,您可以重复使用您的代码:
struct foo
{
// this is the "core" operation, because it's mutating (changes this)
foo& operator+=(const foo&)
{
// ...
return *this;
}
};
foo operator+(const foo& lhs, const foo& rhs)
{
foo ret = lhs;
ret += rhs;
return ret;
}
您制作一个副本,对该副本进行操作,然后返回它。
【讨论】:
operator+ 的情况下,在函数内部复制往往会导致总体上的副本减少。规范形式(恕我直言)应该是:foo operator+(const foo& lhs, const foo& rhs) { foo ret( lhs ); ret += rhs; return ret; }。
operator+= 的内部结构(而不是仅仅将其用作直接函数调用),否则我的表单将导致比按值版本传递第一个参数。有几个因素在起作用。首先,从函数签名中,调用者无法知道它为参数制作的最佳副本可能是返回值;这在函数内部是已知的。其次,虽然operator+= 返回一个引用,但签名本身并不要求它是*this,即使我们知道它应该是。