此运算符定义
Point operator +=(double & left, const Point & right) {
return Point(left + right.x, left + right.y, left + right.z);
}
是错误的,因为它没有为左操作数分配任何内容,并且不返回分配对象的左值。
一般来说,最好将此类运算符定义为类成员函数。
我会用以下方式定义它
class Point
{
//...
Point & operator +=( const Point &rhs )
{
x += rhs.x;
y += rhs.y;
z += rhs.z;
return *this;
}
//...
};
至于你的代码,特别是这个声明
a += b;
那么不清楚是否存在将 double 类型的对象(对象 a 具有的类型)转换为 Point 类型的转换构造函数,因为您没有显示类定义。正如我已经指出的那样,您定义的运算符不会更改左操作数(将基于 object 创建的 Point 类型的临时对象a
)。因此,即使上面的记录在任何情况下都是正确的,原始对象a
也不会改变。
对于用作左操作数的 double 类型的对象,您可以定义运算符 + 而不是运算符 +=。
例如
const Point operator +( double lhs, const Point &rhs )
{
Point p( rhs.x + lhs, rhs.y + lhs, rhs.z + lhs );
return p;
}
您的类的实现细节可能会有所不同,因为我没有看到类定义。然而,这个定义证明了这个想法。
在这种情况下,你可以写
double a = 1.0;
Point b( 1.0, 1.0, 1.0 );
std::cout << a + b << std::endl;
并得到预期的结果
(2, 2, 2)