В нескольких ответах теперь предлагается использовать перегрузку operator+
, не являющуюся членом, чтобы разрешить "добавление" объектов Distance
и int
.Это на самом деле не имеет смысла: что значит добавить Distance
, который имеет единицу, к int
, который не имеет?
Однако, имеет смысл добавить два Distance
объектов вместе.Если у вас есть одно расстояние в два фута и вы добавите к нему другое расстояние в три фута, вы получите расстояние в пять футов.Это имеет смысл.
Вы можете сделать это, перегрузив operator+
между двумя Distance
объектами (для простоты я предположил, что ваш Distance
имеет только одно поле, содержащее дюймы. В реальном приложении выне хотелось бы иметь отдельные поля для дюймов и футов. Возможно, вы захотите использовать единицу СИ, например, метры, но это зависит от приложения и полностью зависит от вас):
Distance operator+(const Distance& lhs, const Distance& rhs)
{
return Distance(lhs.inches + rhs.inches);
}
Это не поможет вам, однако, если вы хотите быть в состоянии сделать что-то вроде
Distance d;
d = d + 42; // assume 42 has the same units as a Distance object has
Для того, чтобы это имело смысл, вы можете использовать конструктор преобразования:
struct Distance
{
Distance(int in = 0) : inches(in) { }
private:
int inches;
};
Конструктор здесь является конвертирующим конструктором, поскольку он не explicit
и может быть вызван с одним аргументом.Это позволяет преобразовать один int
(или значение, которое неявно преобразуется в int
) в объект Distance
.Это позволяет вам писать
Distance d;
d = d + 42;
Почему это отличается от использования перегрузки operator+
, которая принимает аргументы Distance
и int
?Просто: он заставляет преобразование из int
в Distance
иметь место перед добавлением, поэтому фактическое добавление не должно заботиться о его операндах: оно просто добавляет два расстояния вместе и позволяет конструкторам Distance
иметь дело слюбые преобразования, которые необходимо выполнить.