5

当一个类重载operator+时,是否应该将其声明为 const,因为它不对对象进行任何赋值?另外,我知道这一点operator=operator+=返回一个参考,因为已经进行了分配。但是,怎么operator+办?当我实现它时,我是否应该复制当前对象,将给定对象添加到该对象,然后返回该值?

这是我所拥有的:

class Point
{
public:
    int x, int y;

    Point& operator += (const Point& other) {
        X += other.x;
        Y += other.y;
        return *this;
    }

    // The above seems pretty straightforward to me, but what about this?:
    Point operator + (const Point& other) const { // Should this be const?
        Point copy;
        copy.x = x + other.x;
        copy.y = y + other.y;
        return copy;
    }
};

这是正确的实现operator+吗?还是我忽略了一些可能导致麻烦或不需要/未定义的行为的东西?

4

1 回答 1

6

比这更好的是,你应该让它成为一个免费的功能:

Point operator+( Point lhs, const Point& rhs ) { // lhs is a copy
    lhs += rhs;
    return lhs;
}

但是,是的,如果您将其保留为成员函数,它应该是const因为它不会修改左侧对象。

关于是否返回引用或副本,运算符重载的建议是像基本类型那样做(即像ints 那样做)。在这种情况下,两个整数的加法会返回一个单独的整数,该整数既不是对任何一个输入的引用。

于 2012-11-16T05:13:13.923 回答