繁体   English   中英

运算符在struct中重载

[英]Operator Overloading in struct

假设我定义了这个结构:

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; 必须单独处理?

去做就对了:

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中使用转换构造函数)。 在这种情况下,上面的第一个重载将处理所有三种情况。

我就是这样做的。

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; }

在C ++中,结构和类之间只有一个区别:在结构中,默认可见性是公共的,而在类中它是私有的。

除此之外,您可以在结构中的类中执行任何操作,它看起来完全相同。

像在类中一样在结构中编写运算符重载。

这也有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM