-1

点.h

...
Point operator +=(double & left, const Point & right) {
    return Point(left + right.x, left + right.y, left + right.z);
}
// std::ostream is overloaded
...

主文件

#include <iostream>
#include "point.h"

int main() {
    double a = 1.0;
    Point b(1.0, 1.0, 1.0);
    a += b;
    std::cout << a << std::endl;
}

输出:

1

我想返回总和:

(2, 2, 2)

但是在复合赋值时,编译器会保留双精度类型。

4

1 回答 1

1

此运算符定义

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)
于 2015-08-15T09:13:33.773 回答