结构体中的运算符重载

18

假设我定义了这个结构:

struct Point {
   double x, y;
};

我该如何重载+运算符,以便在声明时使用?

Point a, b, c;
double k;

表达式

c = a + b;
产生。
c.x = a.x + b.x;
c.y = a.y + b.y;

以及表达式

c = a + k;
产生。
c.x = a.x + k;
c.y = a.y + k; // ?

后一种情况是否也满足交换律?也就是说,c = a + k;c = k + a; 需要分别处理吗?

4个回答

24

只管去做:

Point operator+( Point const& lhs, Point const& rhs );
Point operator+( Point const& lhs, double rhs );
Point operator+( double lhs, Point const& rhs );

关于你上一个问题,编译器对你的操作符不做任何假设。(记住,在std::string上的+运算符是交换的)。因此,你必须提供两种重载。

或者,你可以提供一个从doublePoint的隐式转换(通过在Point中拥有一个转换构造函数)。在这种情况下,上面的第一个重载将处理所有三种情况。


为什么我们要将Point参数声明为常量? - wjmolina
2
@JosuéMolina 这样你就可以将临时变量传递给它们;你不能用临时变量初始化非 const 引用。考虑到 Point 的简单性,直接通过值传递没有问题,而不是通过引用(在这种情况下,它们是否为 const 是无关紧要的)。但普遍的惯例是通过引用传递类类型,并且当惯例真正普遍并且不会引起其他问题时,最好遵循它们,即使只是让人们不会想知道为什么你做得不同。 - James Kanze
@JamesKanze 不会让它变成不可变的吗? - Savannah Madison

11

这是我会做的方式。

struct Point {
   double x, y;
   struct Point& operator+=(const Point& rhs) { x += rhs.x; y += rhs.y; return *this; }
   struct Point& operator+=(const double& k) { x += k; y += k; return *this; }
};

Point operator+(Point lhs, const Point& rhs) { return lhs += rhs; }
Point operator+(Point lhs, const double k) { return lhs += k; }
Point operator+(const double k, Point rhs) { return rhs += k; }

6
在C++中,结构体和类之间只有一个区别:在结构体中,默认可见性为public,而在类中为private。
除此之外,在结构体中可以像在类中一样做任何事情,它们看起来完全相同。
在结构体中编写操作符重载的方式与在类中相同。

1
我认为提问者不知道如何为一个类完成这个操作。 - Joseph Mansfield

4
这也可以起作用:
struct Point{
    double x,y;
    Point& operator+(const Point& rhs){ 
            x += rhs.x;
            y += rhs.y;
            return *this;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接