Каждая функция-член имеет неявный первый аргумент: this
.Это также верно для операторов.Поэтому, если вы хотите сделать operator+()
членом, он должен принимать только один аргумент, правый операнд, потому что левый операнд уже равен this
.
Однако для бинарных операторов, которые могут быть или функцией-членом, или свободной функцией, мое правило: сделать так, чтобы эти свободные функции обрабатывали свои аргументы симметрично (operator+()
не меняет ни одного из своихоперанды), и сделайте те функции-члены, которые не (operator+=()
изменяет свой левый операнд, но не его правый).
Кроме того, для всех арифметических операторов есть хороший шаблон для их реализации на основе их комбинированного назначенияверсии.То есть operator+()
будет основано на operator+=()
, -
основано на -=
и т. Д.
Добавьте к этому, что вы не хотите копировать объекты класса без необходимости, но обычно хотите, чтобы они передавались в соответствии сconst
ссылка.
Исходя из этого, мои канонические версии operator+
будут:
class Person
{
public:
Person& operator+=(const Person& i)
{
// whatever
return *this;
}
};
inline Person operator+(Person lhs, const Person& rhs)
{
lhs += rhs; // note: lhs passed per copy
return lhs;
}
Однако. Что, вероятно, самое важное правилоБольшой палец относительно перегрузки оператора таков: Не делайте этого .Это может показаться парадоксальным, но чаще всего именованные функции намного лучше, чем операторы, потому что последние делают код менее читаемым, чем обычные функции.А при написании кода удобочитаемость должна быть самым важным аспектом .нет если только операторы не имеют четкое и бесспорное значение в прикладной области, не перегружайте его для класса.
В вашем примере конечно есть нет чистых ибесспорный значение оператора +
применяется к двум лицам.Что значит в реальном мире добавить к людям?(Первое, о чем я мог подумать, это не один человек в результате, а множество людей. :)
)
Так что, если перегрузка этого оператора для вашего Person
класса не является домашним заданием, янастоятельно советую против этого.(И если это задание, я бы упрекнул учителя в том, что он нашел такой плохой пример.)