Перегрузка оператора в конструкции
предположим, что я определяю эту структуру:
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;
}
}