如何在c ++中重载复合赋值?

时间:2015-08-15 09:03:56

标签: c++ class type-conversion operator-overloading compound-assignment

point.h

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

的main.cpp

#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)

但是复合赋值时编译器会保留double类型。

1 个答案:

答案 0 :(得分: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类型的对象(对象的类型)转换为Point类型,因为您没有显示类定义。正如我已经指出的那样,你定义的运算符不会改变左操作数(一个Point类型的临时对象,它将根据对象a创建)。因此,即使上述记录在任何情况下都是正确的,原始对象a也不会被更改。

对于用作左操作数的double类型的对象,您可以定义operator +而不是operator + =。

例如

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)