Перегрузка оператора в конструкции

предположим, что я определяю эту структуру:

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 ответов


Просто сделай это:

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

что касается вашего последнего вопроса, то компилятор делает нет предположения относительно того, что делает ваш оператор. (Помните, + оператор on std::string и не коммутативной.) Так ты должны обеспечить обе перегрузки.

кроме того, вы можете обеспечить неявное преобразование double to Point (имея конструктор преобразования в 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++ есть только одно различие между структурой и классом: в структуре видимость по умолчанию является общедоступной, а в классе-частной.

кроме этого вы можете делать все, что вы сделали бы в классе в структуре, и это будет выглядеть точно так же.

Write перегрузка оператора в структуре, как и в классе.


Это также будет работать:

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