2012-11-16 85 views
5

当一个类重载operator+时,它是否应该被声明为const,因为它不会对该对象进行任何赋值? 此外,我知道operator=operator+=返回一个参考,因为进行了分配。但是,operator+呢?当我实现它时,我应该复制当前对象,将给定的对象添加到该对象,并返回该值?C++ - 我应该使`运算符+`常量?它是否会返回一个参考?

以下是我有:

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+的?或者是否有我忽视的可能会导致麻烦或不必要的/未定义的行为?

+1

运算符重载的很多细节可以在这里找到:http://stackoverflow.com/questions/4421706/operator-overloading – chris

回答

6
比那还好

,你应该让一个免费的功能:

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

但是,是的,如果你把它作为一个成员函数应该是const,因为它不会修改左侧对象。

关于是否返回参考文献或副本,操作员超载的建议是做为基本类型做(即做为int做)。在这种情况下,添加两个整数将返回一个单独的整数,该整数不是对任何一个输入的引用。

+0

啊,我明白了。谢谢。另外,将它作为一项免费功能有什么好处? –

+1

@BrandonMiller:对称类型。如果您的类型具有隐式转换构造函数(即可以隐式转换某种其他类型),则自由函数实现将允许在两个参数上进行转换,而成员函数只能在右侧进行转换。 –

+0

那里有一些很好的信息!我从来没有想到这一点。 –

相关问题